Dlaczego Apache może ignorować hosta wirtualnego o nazwie serwera pasującej do żądanego adresu URL?


26

Próbuję dodać drugi wirtualny host do mojej konfiguracji Apache, ale nie mogę uzyskać nowego wirtualnego hosta do użycia.

Mój httpd.confzawiera tylko następujący wiersz:

ServerName radiofreebrighton.org.uk

Mam również ports.confplik, który zawiera następujące elementy:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    Listen 443
</IfModule>

Mam dwa pliki sites-available, które zostały dowiązane do sites-enabledprzez a2ensite:

  • radiofreebrighton.org.uk
  • trafalgararches.co.uk

Treść pierwszego to:

<VirtualHost _default_:80>
    DocumentRoot /home/tom/www

    ServerAdmin tom@radiofreebrighton.org.uk
    ServerName radiofreebrighton.org.uk
    ServerAlias www.radiofreebrighton.org.uk

    <Directory /home/tom/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log
    LogLevel error
    CustomLog /var/log/apache2/access.log combined

    Alias /wiki /home/tom/www/mediawiki/index.php
</VirtualHost>

Zawartość tego ostatniego to:

<VirtualHost *:80>
    DocumentRoot /home/tom/tata-www

    ServerAdmin admin@trafalgararches.co.uk
    ServerName trafalgararches.co.uk
    ServerAlias www.trafalgararches.co.uk

    <Directory /home/tom/tata-www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    logLevel error
    ErrorLog /var/log/apache2/error.log
</VirtualHost>

Ale za każdym razem, gdy żądam strony z trafalgararches.co.uk, otrzymuję stronę z radiofreebrighton.org.uk. Dlaczego tak się dzieje? Jak mogę to naprawić?


Edytować:

Konfiguracja hosta wirtualnego w rozumieniu apache:

tom@rfb:/usr/local$ apache2ctl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost trafalgararches.co.uk (/etc/apache2/sites-enabled/trafalgararches.co.uk:1)
Syntax OK

(Gleaned via apache2ctl -Saka httpd -S.)


1
Nie jestem pewien, czy to jest przyczyna, ale powinieneś usunąć ukośniki z końców linii ServerNamei ServerAlias. Upewnij się również, że ponownie uruchomiłeś apache.
EEAA

Jestem prawie pewien, że to jest przyczyna. Oznacza to, że nazwa hosta w żądaniu nigdy nie będzie zgodna z nazwą serwera dla tego wirtualnego hosta.
larsks

1
@ErikA, @larsks - Macie nadzieję! Usunąłem końcowe ukośniki i ponownie uruchomiłem apache, ale to nic nie zmieniło.
Tom Wright,

1
Czy masz NameVirtualHost *:80gdzieś w swojej konfiguracji?
larsks

1
Nie jestem pewien, czy wspomniane strony są produkcyjne czy programistyczne, ale tak naprawdę przejście do tych adresów URL daje mi dwie różne strony (poprawne strony po wyglądzie). Jeśli hosty powyżej znajdują się na serwerze programistycznym, zignoruj ​​ten komentarz. W przeciwnym razie mógłbyś rozwiązać problem gdzieś po drodze i nadal mieć kopię w pamięci podręcznej.
cyberx86

Odpowiedzi:


15

To pytanie ma ponad rok, ale natknąłem się na podobny „problem”. Może to być oczywiste, ale nie zapomnij zrestartować usługi Apache po włączeniu dodatkowego hosta wirtualnego. Zobacz, po uruchomieniu a2ensitedla drugiego wirtualnego hosta, wynik apache2ctl -Spokaże, że obie strony są dostępne (i jedna z nich jest domyślna), nawet jeśli nie przeładowałeś apache.

Załóżmy, że masz dwa wirtualne hosty - site1 i site2. Uruchom, a2ensite site1a następnie ponownie załaduj usługę Apache. Teraz możesz uzyskać dostęp http://site1i jest to ustawienie domyślne. Teraz biegniesz a2ensite site2, ale zapomnij zrestartować apache. Wyjście apache2ctl -Sbędzie:

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site2 (/etc/apache2/sites-enabled/site2:1)
Syntax OK

Ale gdy spróbujesz załadować http://site2, faktycznie załaduje domyślną witrynę (site1), ponieważ konfiguracja nie jest ładowana.


Otrzymuję tę samą wydajność, ale nawet wtedy nie ładuje drugiej strony.
arqam

15

Miałem podobny problem, gdy wszystkie moje dodatkowe vhosty na porcie 443 (SSL / HTTPS) były przekierowywane do katalogu pierwszego wymienionego vhosta. Apache zasadniczo ignorował właściwość servername i pasował tylko na ip: port.

Okazuje się, że brakowało mi polecenia „NameVirtualHost *: 443”, aby włączyć Nazwany wirtualny hosting dla portu 443.

„NameVirtualHost *: 443” należy wywołać tylko raz i należy go zdefiniować nad vhostami dla portu 443. Umieściłem swoją definicję w pliku ports.config, aby wyglądał następująco:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

Nie zapomnij zrestartować apache po jakichkolwiek zmianach.


1
Za to, co jest warte ... w Apache 2.4.18, użycie NameVirtualHostpowoduje wyświetlenie tego komunikatu przy uruchomieniu:AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf
Lambart

4

Moje 2 centy: ponieważ muszę trzymać się adresu IP (nie chcę, aby witryna była obsługiwana we wszystkich zainstalowanych sieciach), zdarzyło się, że po zmianie lokalnego prywatnego adresu IP serwera zapomniałem go tutaj zmienić:

NameVirtualHost 192.168.100.20:80 <VirtualHost 192.168.100.20:80>

Oczywiście nie jest to problem Apache informujący, że IP nie istnieje lokalnie.


2

Tom, spójrz tutaj http://httpd.apache.org/docs/2.0/en/mod/core.html#namevirtualhost

Uwaga

Zauważ, że „serwer główny” i inne domyślne serwery nigdy nie będą obsługiwane dla żądania adresu IP NameVirtualHost (chyba że z jakiegoś powodu określisz NameVirtualHost, ale nie zdefiniujesz żadnych VirtualHosts dla tego adresu).

Więc powinno być w porządku, jeśli zmienisz domyślny adres IP twojego serwera.


Próbowałem tego, ale nic to nie zmieniło. Chciałbym również uniknąć wiązania się z konkretnym adresem IP, więc zamierzam go zmienić z powrotem. Powinienem również zauważyć, że domyślny vhost to ten, który działa.
Tom Wright,

1

Znajduję odpowiedź tutaj: http://alexking.org/blog/2007/11/01/apache-2-only-serves-first-virtual-host

Umieść 2 nazwy serwera w tym samym 1 znaczniku VirtualHost, jak poniżej:

<VirtualHost *:80>
ServerName beta-site-1.com
DocumentRoot "/Library/WebServer/beta-site-1"

ServerName beta-site-2.com
DocumentRoot "/Library/WebServer/beta-site-2"
</VirtualHost>

Skończyło się problemy z drugą witryną, ponieważ miałem dwa bloki tagów VirtualHost.


0

Miałem ten problem z migracją witryn na nowy serwer Ubuntu 16. Po drobnych zarysowaniach zdałem sobie sprawę, że moduł SSL nie jest domyślnie włączony, więc wszystko w <IfModule mod_ssl.c>blokach jest oczywiście dyskretnie ignorowane.

Wiele lat temu zawarłem wszystkie moje vhosty SSL w tym stanie warunkowym i tym razem właśnie skopiowałem pliki konfiguracyjne na nowy serwer.

Naprawiłem to, włączając moduł:

sudo a2enmod ssl

0

Odkryłem, że źródłem tego problemu jest wpis / etc / hosts na moim serwerze z adresem URL wskazującym na zewnętrzny adres IP serwera.

W pewnym momencie musiałem go skonfigurować, zanim DNS był gotowy, więc wprowadziłem wpis / etc / hosts na moim serwerze wskazujący na jego własny zewnętrzny adres IP:

1.2.3.4 vhost.example.com

Następnie skonfigurowałem ServerAlias ​​w istniejącej witrynie dla „vhost.example.com”

Ale nic, co mogłem zrobić, nie powstrzymałoby Apache'a od serwowania strony default-ssl.conf dla żądań SSL do vhost.example.com. Port 80 HTTP działał OK, ale SSL zawsze pokazywał domyślną stronę. W końcu ten wątek SO skłonił mnie do wypróbowania „apachectl -S”, który pokazuje strony i wreszcie udało mi się to rozgryźć.

Więc jeśli otrzymujesz domyślną witrynę SSL zamiast oczekiwanej, upewnij się, że nie dodałeś zewnętrznego adresu IP serwera we wpisie / etc / hosts! Całkiem dziwna rzecz do zrobienia z perspektywy czasu, ale miejmy nadzieję, że to pomaga komuś innemu!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.