
Server: Debian Jessie Apache: 2.4.9-1 PHP: 5.5
Ich möchte, dass alle Nichtdateien und Nichtverzeichnisse zu index.php umgeleitet werden, wo ich sie selbst verwalte. Aufgrund der Art meines Projekts muss ich von einem virtuellen Host aus arbeiten.
Ich verwende virtuelles Hosting (vHosts) zusammen mit mod_rewrite in einem Webprojekt, an dem ich arbeite. Hier ist die vHost-Datei ...
<VirtualHost *:80>
ServerName foo.com
ServerAlias www.foo.com
ServerAdmin [email protected]
DocumentRoot /srv/foo/main/www/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [L]
</IfModule>
</VirtualHost>
Der vHost funktioniert wie erwartet und die Umschreiberegeln leiten Anfragen wie erwartet an index.php um. Wenn ich jedoch versuche, auf Dateien auf dem Server zuzugreifen, beispielsweise:
foo.com/css/style.css
gelegen in:
/srv/foo/main/www/css/style.css
meine Anfrage wird an index.php weitergeleitet
Das ist merkwürdig, da das Umschreiben der Bedingungsanweisungen das Problem eigentlich beheben soll.
Alle Ordnerberechtigungen sind auf 755 eingestellt, alle Dateien auf 644.
Ich konnte zweifelsfrei bestätigen, dass die Umschreibbedingungen erfüllt sind, obwohl sie es nicht sein sollten. Dies konnte ich feststellen, indem ich mir das Fehlerprotokoll von Apache mit aktivierter Debug-Ausgabe für mod_rewrite ansah.
Warum stimmen die beiden RewriteCond-Anweisungen nicht überein?
Wird ihnen möglicherweise das vHost DocumentRoot nicht angezeigt?
UPDATE: Wenn ich die Rewrite-Engine AUSSCHALTE, kann ich an die Datei gelangen, mit der ich teste. IE, meine URI ist korrekt. Ich weiß, dass mein Pfad gut ist, die Bedingungen schlagen nur aus irgendeinem Grund fehl.
Antwort1
Für alle, die Apache 2.4 mit virtuellen Hosts verwenden und mod_rewrite innerhalb des besagten virtuellen Hosts mit Umschreibbedingungen verwenden möchten, die Dateien oder Ordner innerhalb des virtuellen Hosts überprüfen müssen, ist hier die Vorgehensweise zum Ausführen der Umschreibbedingungen aufgeführt …
<VirtualHost *:80>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.*)$ /index.php [L]
</IfModule>
</VirtualHost>
Ich habe mir das ausgedacht und es scheint gut zu funktionieren.
Die Erklärung...
%{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI}
gibt Ihnen ein kontextsensitives Dokumentstammverzeichnis. D. h. das Dokumentstammverzeichnis NACH der Anwendung des virtuellen Hostings. Sie erhalten jedoch nicht die URI, daher müssen wir diese hinzufügen, %{REQUEST_URI}
um die Aufgabe abzuschließen.
CONTEXT_DOC_ROOT == /srv/foo/main/www
REQUEST_URI == /css/style.css
CONTEXT_DOC_ROOT + REQUEST_URI == /srv/foo/main/www/css/style.css
Der Rest ist einfach. Tolle Soße. Hoffe, das hilft!