Warum ignoriert Apache möglicherweise einen virtuellen Host mit einem Servernamen, der der angeforderten URL entspricht?

26

Ich versuche, meiner Apache-Konfiguration einen zweiten virtuellen Host hinzuzufügen, kann den neuen virtuellen Host jedoch anscheinend nicht verwenden.

Meine httpd.confenthält nur die folgende Zeile:

ServerName radiofreebrighton.org.uk

Ich habe auch eine ports.confDatei, die Folgendes enthält:

NameVirtualHost *:80
Listen 80

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

Ich habe zwei Dateien, auf sites-availabledie durch einen Link verwiesen sites-enabledwurde a2ensite:

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

Der Inhalt des ersten ist:

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

    ServerAdmin [email protected]
    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>

Der Inhalt des letzteren ist:

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

    ServerAdmin [email protected]
    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>

Aber jedes Mal, wenn ich eine Seite von trafalgararches.co.uk anfordere, bekomme ich eine Seite von radiofreebrighton.org.uk. Warum könnte das passieren? Wie kann ich es reparieren?


Bearbeiten:

Konfiguration des virtuellen Hosts im Sinne von 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

(Gelesen über apache2ctl -Saka httpd -S.)

Tom Wright
quelle
1
Ich bin mir nicht sicher, ob dies die Ursache ist, aber Sie sollten die Schrägstriche an den Enden Ihrer ServerNameund ServerAlias-Linien entfernen . Stellen Sie außerdem sicher, dass Sie Apache neu gestartet haben.
EEAA
Ich bin mir fast sicher, dass das die Ursache ist. Dies bedeutet, dass der Hostname in der Anforderung niemals mit dem Servernamen für diesen virtuellen Host übereinstimmt.
Larsks
1
@ErikA, @larsks - Ihr habt meine Hoffnungen geweckt! Ich habe die nachgestellten Schrägstriche entfernt und Apache neu gestartet, aber es hat sich nichts geändert.
Tom Wright
1
Hast du NameVirtualHost *:80irgendwo in deiner Konfiguration?
Larsks
1
Ich bin mir nicht sicher, ob es sich bei den oben genannten Websites um Produktionen oder Entwicklungen handelt. Wenn ich jedoch auf diese URLs gehe, werden zwei verschiedene Seiten für mich angezeigt (anscheinend die richtigen Seiten). Wenn sich die obigen vhosts auf einem Entwicklungsserver befinden, ignorieren Sie diesen Kommentar. Andernfalls haben Sie möglicherweise Ihr Problem unterwegs behoben und immer noch eine zwischengespeicherte Kopie.
cyberx86

Antworten:

15

Nun, diese Frage ist über ein Jahr alt, aber ich bin auf ein ähnliches "Problem" gestoßen. Dies mag offensichtlich sein, aber vergessen Sie nicht, den Apache-Dienst neu zu starten, nachdem Sie zusätzlichen virtuellen Host aktiviert haben. Nach der Ausführung a2ensitefür den zweiten virtuellen Host zeigt die Ausgabe von apache2ctl -San, dass beide Sites verfügbar sind (und eine davon ist die Standardeinstellung), auch wenn Sie Apache nicht neu geladen haben.

Angenommen, Sie haben zwei virtuelle Hosts - Site1 und Site2. Sie führen den a2ensite site1Apache-Dienst aus und laden ihn erneut. Jetzt können Sie zugreifen http://site1und es ist die Standardeinstellung. Jetzt rennst du a2ensite site2aber vergiss Apache neu zu starten. Die Ausgabe von apache2ctl -Swird sein:

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

Wenn Sie jedoch versuchen zu laden http://site2, wird die Standardsite (site1) tatsächlich geladen, da die Konfiguration nicht geladen wird.

prngleo
quelle
Ich bekomme die gleiche Ausgabe, aber selbst dann wird die zweite Website nicht geladen.
Arqam
15

Ich hatte ein ähnliches Problem, bei dem meine zusätzlichen vhosts auf Port 443 (SSL / HTTPS) alle in das Verzeichnis des ersten aufgeführten vhost geleitet wurden. Apache ignorierte im Wesentlichen die servername -Eigenschaft und stimmte nur auf dem ip: -Port überein.

Es stellte sich heraus, dass mir der Befehl 'NameVirtualHost *: 443' fehlte, um das benannte virtuelle Hosting für Port 443 zu aktivieren.

'NameVirtualHost *: 443' muss nur einmal aufgerufen werden und muss über Ihren vhosts für Port 443 definiert werden. Ich habe meine Definition in die Datei ports.config eingefügt, damit sie so aussieht:

NameVirtualHost *:80
Listen 80

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

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

Vergiss nicht, Apache nach jeder Änderung neu zu starten.

Lucas
quelle
1
Wenn Sie in Apache 2.4.18 NameVirtualHostdie folgende Meldung beim Start verwenden:AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf
Lambart
4

Meine 2 Cent: Da ich mich an eine IP halten muss (ich möchte nicht, dass die Site in allen installierten Netzwerken bereitgestellt wird), habe ich vergessen, diese zu ändern, nachdem sich die lokale private IP des Servers geändert hat:

NameVirtualHost 192.168.100.20:80 <VirtualHost 192.168.100.20:80>

Natürlich ist es kein Apache-Problem, Ihnen mitzuteilen, dass IP lokal nicht vorhanden ist.

Maraboshi
quelle
2

Tom, bitte schau hier nach http://httpd.apache.org/docs/2.0/en/mod/core.html#namevirtualhost

Hinweis

Beachten Sie , dass die „Hauptserver“ und alle Standard - Server werden nie werden serviert eine Anfrage an einen Namevirtualhost IP - Adresse (es sei denn , aus irgendeinem Grund angeben Namevirtualhost aber dann definieren keine Virtual für diese Adresse).

Es sollte also in Ordnung sein, wenn Sie die Standard- IP-Adresse Ihres Servers ändern .

Marcel Kronenberg
quelle
Ich habe es versucht, aber es hat nichts geändert. Ich möchte auch vermeiden, mich an eine bestimmte IP zu binden, also werde ich sie zurückändern. Außerdem sollte ich darauf hinweisen, dass der Standard-vhost derjenige ist, der funktioniert.
Tom Wright
1

Ich finde die Antwort hier: http://alexking.org/blog/2007/11/01/apache-2-only-serves-first-virtual-host

Fügen Sie 2 Servernamen in dasselbe 1 VirtualHost-Tag wie unten ein:

<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>

Ich hatte Probleme mit der zweiten Site, weil ich zwei VirtualHost-Tag-Blöcke hatte.

Tu Uyen
quelle
0

Ich hatte dieses Problem beim Migrieren von Sites auf einen neuen Ubuntu 16-Server. Nach einigem Kopfkratzen stellte ich fest, dass das SSL-Modul nicht standardmäßig aktiviert war, sodass alle Elemente in den <IfModule mod_ssl.c>Blöcken natürlich unbemerkt ignoriert werden.

Vor Jahren habe ich alle meine SSL-vhosts in diese Bedingung eingeschlossen, und diesmal hatte ich gerade die Konfigurationsdateien auf den neuen Server kopiert.

Ich habe es durch Aktivieren des Moduls behoben:

sudo a2enmod ssl
scipilot
quelle
0

Ich habe festgestellt, dass die Ursache für dieses Problem ein / etc / hosts-Eintrag auf meinem Server ist, in dem die URL auf die externe IP des Servers verweist.

Irgendwann muss ich es eingerichtet haben, bevor DNS fertig war, also habe ich einen / etc / hosts-Eintrag auf meinem Server eingegeben, der auf seine eigene externe IP verweist:

1.2.3.4 vhost.example.com

Dann richte ich ein ServerAlias ​​zu einer vorhandenen Site für "vhost.example.com" ein

Aber nichts, was ich tun könnte, würde verhindern, dass Apache die Standard-ssl.conf-Site für SSL-Anforderungen an vhost.example.com bereitstellt. Port 80 HTTP funktionierte einwandfrei, aber das SSL zeigte stattdessen immer die Standard-Site. Am Ende brachte mich dieser SO-Thread dazu, "apachectl -S" zu versuchen, das Websites anzeigt, und schließlich konnte ich es herausfinden.

Wenn Sie also die Standard-SSL-Site anstelle der erwarteten Site erhalten, stellen Sie sicher, dass Sie die externe IP-Adresse Ihres Servers nicht in einem / etc / hosts-Eintrag hinzugefügt haben! Eine ziemlich seltsame Sache im Nachhinein, aber hoffentlich hilft das jemand anderem!

Professor Falken
quelle