2 Stimmen

Apache mod_rewrite liefert eine fehlerhafte Anfrage im WAMPServer

Ich verwende Windows 7 64 bit mit WAMPServer 2.1. Die Version von Apache ist 2.2.17. Ich versuche, eine einfache Rewrite-Regel einzurichten in httpd.conf :

<IfModule rewrite_module>
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1 [PT,QSA,L]
</IfModule>

Ich habe schon früher einfachere RewriteRules zum Laufen gebracht, ohne Regex, Rewrite-Ausdrücke und dergleichen. Es scheint jedoch, dass ich an diesem Punkt eine 400 Bad Request Fehler, wenn versucht wird, eine URL zu besuchen, wenn diese Regel aktiv ist. Die Apache-Protokolldatei zeigt diese Fehler an, wenn dies geschieht:

[Sat Feb 26 10:24:18 2011] [error] [client 127.0.0.1] Invalid URI in request GET /index.php HTTP/1.1
[Sat Feb 26 10:24:21 2011] [error] [client 127.0.0.1] Invalid URI in request GET / HTTP/1.1

Der erste Fehler, den ich versuchte, war localhost/index.php . Die zweite habe ich gerade versucht localhost .

Und selbst wenn die einfachere Regel funktionierte, wurde die RewriteCond Zeilen schien nicht zu funktionieren: statische bestehende Dateien wie style.css wurden trotzdem umgeleitet.

Das Aktivieren von RewriteLogging scheint Apache zum Absturz zu bringen, was anscheinend ein dokumentiertes Problem auf 64-Bit-Rechnern mit Windows 7 . Haben Sie eine Idee, was das Problem sein könnte?

2voto

Tim Stone Punkte 18999

Hier gibt es zwei Probleme, die wahrscheinlich zu Ihren Schwierigkeiten beitragen. Erstens können Sie das Vorhandensein von Dateien nicht so einfach im Serverkontext überprüfen (wie bei httpd.conf), da die Anfrage noch nicht auf das Dateisystem abgebildet worden ist.

Wenn Ihre Anfragen nach statischen Ressourcen direkt mit Ihrer Dateisystemstruktur jenseits Ihres DOCUMENT_ROOT übereinstimmen, können Sie dieses Problem lösen, indem Sie den Wert von DOCUMENT_ROOT vor der eingehenden REQUEST_URI wie folgt anhängen:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d

Wenn der Pfad zu Ihren statischen Ressourcen irgendwo auf der Strecke geändert wird, wird die mod_rewrite-Dokumentation schlägt vor, Folgendes zu verwenden, das eine Unteranforderung ausgibt, um eine Vorausschau auf der Grundlage der Anforderungs-URI durchzuführen:

RewriteCond %{LA-U:REQUEST_FILENAME} !-f
RewriteCond %{LA-U:REQUEST_FILENAME} !-d

Dieser Ansatz ist allerdings teurer, weshalb Sie nach Möglichkeit die erste Variante wählen sollten.

Zweitens ist der URI, den Sie in die Anfrage zurückgeben, eigentlich ungültig, da er den führenden Schrägstrich benötigt. Wenn Sie das korrigieren und mit den neuen Bedingungen oben kombinieren, erhalten Sie diesen geänderten Regelsatz:

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^.*$ /index.php?page=$0 [PT,QSA,L]

Beachten Sie, dass der Wert von page hat hier immer einen führenden Schrägstrich, so dass Sie stattdessen diese Regel verwenden sollten, je nach Ihrer Verarbeitungslogik in index.php:

RewriteRule ^/(.*)$ /index.php?page=$1 [PT,QSA,L]

0voto

mailo Punkte 2571

Haben Sie versucht, die Option

RewriteBase /Ihr_Verzeichnis

variabel?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X