So debuggen Sie Apache mod_rewrite

171

Ich habe zwei Hauptprobleme mit mod_rewrite:

1) Wenn ich eine ungültige Regel habe, wird kein aussagekräftiger Fehler gemeldet

Geben Sie hier die Bildbeschreibung ein

2) Um jede Änderung zuverlässig zu testen, muss ich den Chrome-Cache löschen. Dies ist keine Raketenwissenschaft, aber ich muss Strg + Umschalt + Entf drücken, dann auf OK klicken, das Fenster schließen und neu laden.

Ich würde gerne sehen, ob einer der Gurus bereit ist, seine Geheimnisse zu teilen, um mod_rewrite-Code effizient zu verwalten.

puk
quelle
1
Puk, siehe stackoverflow.com/questions/9153262/…, wo ich einige der Standardtricks diskutiere.
TerryE
Mögliches Duplikat von How to Debug htaccess rewrite script
Benutzer

Antworten:

283

Ein Trick besteht darin, das Umschreibungsprotokoll zu aktivieren. Versuchen Sie zum Aktivieren diese Zeilen in Ihrer Apache-Hauptkonfiguration oder in der aktuellen virtuellen Hostdatei ( nicht in .htaccess):

RewriteEngine On
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Seit Apache httpd 2.4 mod_rewrite wurden die Direktiven RewriteLog und RewriteLogLevel vollständig durch die neue Protokollierungskonfiguration pro Modul ersetzt.

LogLevel alert rewrite:trace6
Ben
quelle
81
Sie können dies nicht in .htaccess einfügen. Sie müssen es in die VirtualHost-Konfiguration einfügen.
Attila Szeremi
7
Sie müssen den RewriteEngine OnAbschnitt auch dort haben, denn wenn Sie ihn nur (wie ich) in der .htaccessDatei aktivieren , wird nichts protokolliert.
Chacham15
12
Wo befindet sich die Protokolldatei in Apache 2.4?
Charles John Thompson III
4
Sie finden die 2.4-Protokollelemente im entsprechenden Fehlerprotokoll. Dies kann von Ihrer Konfiguration abhängen, aber Standard-Debian / Ubuntu-Setups haben sie in /var/log/apache2/error.log
Josiah
10
Profi-Tipp: Denken Sie daran, das Umschreiben der Protokollierung zu deaktivieren. Wenn Sie vergessen, füllen Sie Ihre Festplatte ziemlich schnell auf, insbesondere auf einem Produktionsserver.
John Hunt
132

Die von Ben erwähnte LogRewrite-Direktive ist in Apache 2.4 nicht mehr verfügbar. Sie müssen stattdessen die LogLevel-Direktive verwenden. Z.B

LogLevel alert rewrite:trace6

Siehe http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#logging

Tobias Schultze
quelle
22
Wo ist die Protokolldatei damit verbunden?
Charles John Thompson III
8
@CharlesJohnThompsonIII - Die Protokolldatei ist das Fehlerprotokoll (angegeben durch die ErrorLog-Direktive). Per docs können Sie nur die Umschreibungsnachrichten mit grep erhalten:tail -f error_log|fgrep '[rewrite:'
billynoah
1
Vergessen Sie nicht, Apache neu zu starten
Buchhalter م
1
Ich musste sicherstellen, dass AllowOverrideeingestellt war All!
Michael
25

Verwenden Sie für die grundlegende URL-Auflösung einen Befehlszeilenabruf wie wgetoder curlzum Testen anstelle eines manuellen Browsers. Dann müssen Sie keinen Cache leeren. Klicken Sie einfach auf den Pfeil und geben Sie in eine Shell ein, um Ihre Testabrufe erneut auszuführen.

Kaz
quelle
14
Ein weiterer Trick ist die Verwendung des Chrome "Porno-Modus" (Strg + Umschalt + N). Wenn Sie das Fenster schließen, wird jeder zwischengespeicherte Sitzungskontext verworfen.
TerryE
Ich denke, dass Firefox auch "private Sitzung" durchsucht. Aber sagen Sie, dass dieser Kontext für
Kaz
2
AFAIK, Chrome und Ff unterscheiden sich darin, dass Ff als einzelner Prozess ausgeführt wird, der sich im privaten Modus befindet oder nicht. Bei Chrome wird jeder Tab oder jedes Fenster als separater Prozess ausgeführt und kann einzeln im privaten Modus ausgeführt werden. Schließen Sie ein privates Fenster / eine private Registerkarte, und der Kontext wird verworfen.
TerryE
1
PrivateTab Addon für FF macht das Ding. Jede Registerkarte funktioniert einzeln.
Javid
Diese Methode zeigt auch Weiterleitungen! Schön für jemanden, der keinen Zugriff auf die Apache-Konfigurationsdatei des Computers hat.
Geof Sawaya
14

Da ist der htaccess-Tester .

Es zeigt, welche Bedingungen für eine bestimmte URL getestet wurden, welche die Kriterien erfüllten und welche Regeln ausgeführt wurden.

Es scheint jedoch einige Pannen zu haben.

Andy
quelle
2
Für mich zeigte es eine grün ausgeführte Regel in der letzten Zeile ohne Code.
Andy
@ thombr kannst du bitte genauer sein? Der Link funktioniert nicht? Oder das Werkzeug? Was genau funktioniert nicht? Und warum ist das im Zusammenhang mit dieser Frage relevant?
Andy
1
Dies sagt mir, dass die URL wie erwartet transformiert wird ... aber auf dem tatsächlichen Server bekomme ich eine 404
Michael
@michael ist die getestete Regel die einzige in Ihrer Konfiguration? Ist mod_rewrite tatsächlich installiert und aktiv?
Andy
Es stellte sich heraus, dass Überschreibungen nicht aktiviert waren
Michael
3

Basierend auf Bens Antwort können Sie Folgendes tun, wenn Sie Apache unter Linux ausführen (in meinem Fall Debian).

Erstellen Sie zuerst die Datei rewrite-log.load

/etc/apache2/mods-availabe/rewrite-log.load

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Dann treten Sie ein

$ a2enmod rewrite-log

gefolgt von

$ service apache2 restart

Und wenn Sie mit dem Debuggen Ihrer Umschreiberegeln fertig sind

$ a2dismod rewrite-log && service apache2 restart

Fließen
quelle
Das hat nicht funktioniert. Ich erhalte sandino @ envy: ~ $ sudo service apache2 restart * Neustart des Webservers apache2 [fehlgeschlagen] * Die Konfiguration von apache2 ist fehlgeschlagen. Die Ausgabe des Konfigurationstests war: AH00526: Syntaxfehler in Zeile 1 von /etc/apache2/mods-enabled/rewrite-log.load: Ungültiger Befehl 'RewriteLog', möglicherweise falsch geschrieben oder von einem Modul definiert, das nicht in der Serverkonfiguration enthalten ist
sandino
3
@sandino, welche Apache-Version laufen Sie? Es scheint, dass diese Syntax für 2.4 geändert wurde, verwenden Sie stattdessen: LogLevel warn rewrite:trace8oder LogLevel info rewrite:trace8wo 8 eine beliebige Zahl von 1-8 sein kann
Insaner