Hallo zusammen,
Ich habe einen Apache-Server mit mehreren namensbasierten VirtualHosts.
Die Zuordnung der Anfragen zu dem jeweiligen VirtualHost funktioniert
nicht richtig. Die im Netz verfügbaren Informationen und Forumsbeiträge
habe ich gelesen und berücksichtigt, ich konnte das Problem dennoch
nicht lösen.
Kurze Zusammenfassung: ich habe eine Domain (domain.xyz) und zwei
Subdomains (aaa.domain.xyz und www.domain.xyz).
Auf domain.xyz ist eine Website gehostet, die wie erwartet funktioniert.
Auf aaa.domain.xyz ist ein Reverse Proxy konfiguriert, der auf einen
weiteren Webserver auf localhost umleitet. Funktioniert wie erwartet.
Auf www.domain.xyz ist eine weitere Website konfiguriert, prinzipiell
wie die Hauptdomain (domain.xyz). Dieser VirtualHost macht mir Probleme.
Die DNS-Records sind korrekt eingerichtet (alle verweisen auf die feste
IP-Adresse des Servers).
(P.S. Die Domains heißen natürlich anders, ich habe sie generisch
umbenannt, ohne weitere Auswirkungen - alphabetische Abfolge beim Laden
der Konfigurationsdateien bleibt auch unverändert. Außerdem habe ich
sämtliche Infos zu den HTTP-VirtualHosts auf Port 80 der
Übersichtlichkeit halber weggelassen, weil sie in Bezug auf das
Verhalten der HTTPS-VirtualHosts ohne Bedeutung sein dürften.)
Hier die wesentlichen Konfigurationsdateien:
1 | root@domain:~# cat /etc/apache2/sites-enabled/aaa.domain.xyz-le-ssl.conf
|
2 | <IfModule mod_ssl.c>
|
3 | <VirtualHost *:443>
|
4 | ServerName aaa.domain.xyz
|
5 | Protocols h2 h2c http/1.1
|
6 | H2Direct on
|
7 | SSLProxyEngine on
|
8 |
|
9 | ProxyPassMatch (.*)(\/websocket)$ "ws://127.0.0.1:12345/$1$2"
|
10 | ProxyPass / "http://127.0.0.1:12345/"
|
11 | ProxyPassReverse / "http://127.0.0.1:12345/"
|
12 |
|
13 | SSLCertificateFile /etc/letsencrypt/live/aaa.domain.xyz/fullchain.pem
|
14 | SSLCertificateKeyFile /etc/letsencrypt/live/aaa.domain.xyz/privkey.pem
|
15 | Include /etc/letsencrypt/options-ssl-apache.conf
|
16 |
|
17 | SetEnvIf Host "^(.*)$" THE_HOST=$1
|
18 | RequestHeader setifempty X-Forwarded-Proto https
|
19 | RequestHeader setifempty X-Forwarded-Host %{THE_HOST}e
|
20 | ProxyAddHeaders Off
|
21 | </VirtualHost>
|
22 | </IfModule>
|
1 | <IfModule mod_ssl.c>
|
2 | <VirtualHost *:443>
|
3 | ServerName domain.xyz
|
4 | DocumentRoot /var/www/html/domain.xyz/
|
5 | Protocols h2 h2c http/1.1
|
6 | H2Direct on
|
7 |
|
8 | <Directory /var/www/html/domain.xyz/>
|
9 | Options +FollowSymlinks
|
10 | AllowOverride All
|
11 | Require all granted
|
12 | </Directory>
|
13 |
|
14 | <IfModule mod_headers.c>
|
15 | Header always set Strict-Transport-Security "max-age=15552000"
|
16 | </IfModule>
|
17 |
|
18 | SSLCertificateFile /etc/letsencrypt/live/domain.xyz/fullchain.pem
|
19 | SSLCertificateKeyFile /etc/letsencrypt/live/domain.xyz/privkey.pem
|
20 | Include /etc/letsencrypt/options-ssl-apache.conf
|
21 | </VirtualHost>
|
22 | </IfModule>
|
1 | root@domain:~# cat /etc/apache2/sites-enabled/www.domain.xyz-le-ssl.conf
|
2 | <IfModule mod_ssl.c>
|
3 | <VirtualHost *:443>
|
4 | ServerName www.domain.xyz
|
5 | DocumentRoot /var/www/html/www.domain.xyz/
|
6 | Protocols h2 h2c http/1.1
|
7 | H2Direct on
|
8 |
|
9 | <Directory /var/www/html/www.domain.xyz/>
|
10 | Require all granted
|
11 | Options +Indexes
|
12 | </Directory>
|
13 |
|
14 | SSLCertificateFile /etc/letsencrypt/live/www.domain.xyz/fullchain.pem
|
15 | SSLCertificateKeyFile /etc/letsencrypt/live/www.domain.xyz/privkey.pem
|
16 | Include /etc/letsencrypt/options-ssl-apache.conf
|
17 | </VirtualHost>
|
18 | </IfModule>
|
Außerdem zur Info:
1 | root@domain:~# apachectl -S
|
2 | VirtualHost configuration:
|
3 | *:443 is a NameVirtualHost
|
4 | default server aaa.domain.xyz (/etc/apache2/sites-enabled/aaa.domain.xyz-le-ssl.conf:2)
|
5 | port 443 namevhost aaa.domain.xyz (/etc/apache2/sites-enabled/aaa.domain.xyz-le-ssl.conf:2)
|
6 | port 443 namevhost domain.xyz (/etc/apache2/sites-enabled/domain.xyz-le-ssl.conf:2)
|
7 | port 443 namevhost www.domain.xyz (/etc/apache2/sites-enabled/www.domain.xyz-le-ssl.conf:2)
|
Wie man sieht, ist aaa.domain.xyz der Default-Server (weil alphabetisch
als erstes inkludiert). Nun wird beim Aufruf der URL
https://www.domain.xyz/ nicht die richtige Seite dargestellt, sondern
stattdessen die Konfiguration für domain.xyz verwendet. Das wundert mich
in zweifacher Hinsicht: zum einen, weil ich in der Konfiguration für
www.domain.xyz keinen Fehler erkennen kann und sie auch analog zur
Konfiguration für domain.xyz ist (im Wesentlichen nur unterschiedliches
DocumentRoot-Verzeichnis). Zum anderen, weil ich bei einer fehlerhaften
Konfiguration erwarten würde, dass der Default-Server aaa.domain.xyz
verwendet wird.
Wenn ich nun bei www.domain.xyz folgende zwei Zeilen zusätzlich einfüge,
ist das Verhalten allerdings wie erwartet: für alle URLs wird eine leere
Antwort mit HTTP-Statuscode 204 zurückgegeben.
1 | RewriteEngine On
|
2 | RewriteRule .* - [R=204]
|
Aufgrund dieses Verhaltens spekuliere ich, dass ein Problem mit dem
DocumentRoot-Verzeichnis vorliegt. Die Berechtigungen fürs
DocumentRoot-Verzeichnis sind in beiden Fällen 0755, für die enthaltenen
Dateien (insb. index.html, index.php) 0644. Für beide VirtualHosts im
Prinzip gleich.
Hat jemand eine Idee, wo der Fehler liegt? Gibt es eine Möglichkeit, den
"Entscheidungsprozess" von Apache bei der Zuordnung der Anfragen zu den
VirtualHosts zu debuggen?
Die mir bekannten üblichen Anfängerfehler dürften es nicht sein, d.h.
die VirtualHosts sind aktiviert und die Apache-Konfiguration wurde neu
geladen bzw. auch der Server bereits mehrmals neu gestartet (siehe auch
Ausgabe von "apachectl -S").
Grüße und guten Rutsch
vorticon