So debuggen Sie .htaccess RewriteRule funktioniert nicht

115

Ich habe eine RewriteRulein einer .htaccessDatei, die nichts tut. Wie behebe ich das?

  • Wie kann ich überprüfen, ob die .htaccessDatei überhaupt von Apache gelesen und befolgt wird? Kann ich eine Echo-Nachricht "Es funktioniert" schreiben, wenn ich sie schreibe, wo würde diese Zeile wiedergegeben werden?
  • .htaccessWie kann ich Apache dazu bringen, die Datei zu verwenden, wenn sie nicht verwendet wird?
  • Was kann ich noch tun, um zu debuggen, wenn das verwendet .htaccesswird, aber mein RewriteRuleEffekt immer noch nicht wirkt?
macha
quelle

Antworten:

143

Geben Sie einige Junk - Wert in Ihr .htaccess zB foo bar, sakjnaskljdnas irgendein Schlüsselwort nicht durch .htaccess erkannt und Ihre URL besuchen. Wenn es funktioniert, sollten Sie eine bekommen

500 Interner Serverfehler

interner Serverfehler

Der Server hat einen internen Fehler oder eine Fehlkonfiguration festgestellt und konnte Ihre Anforderung nicht ausführen.

Ich schlage vor, dass Sie es bald danach setzen RewriteEngine on.


Da bist du auf deiner Maschine. Ich nehme an, Sie haben Zugriff auf die Apache- .confDatei.

Öffnen Sie die .confDatei und suchen Sie nach einer Zeile ähnlich der folgenden:

LoadModule rewrite_module modules/mod_rewrite.so

Wenn es kommentiert ist (#), kommentieren Sie Apache aus und starten Sie es neu.


Um das Umschreiben zu protokollieren

RewriteEngine On
RewriteLog "/path/to/rewrite.log"
RewriteLogLevel 9

Fügen Sie die obigen 3 Zeilen in Ihre ein virtualhost. Starten Sie den httpd neu.

RewriteLogLevel 9Wenn Sie einen hohen Wert für Level verwenden, wird Ihr Apache-Server dramatisch verlangsamt! Verwenden Sie das Umschreiben der Protokolldatei auf einer Stufe größer als 2 nur zum Debuggen! Stufe 9 protokolliert fast jedes Umschreibungsdetail.


AKTUALISIEREN

In Apache 2.4 haben sich die Dinge geändert:

VON Upgrade von 2.2 auf 2.4

Die Anweisungen RewriteLog und RewriteLogLevel wurden entfernt. Diese Funktionalität wird jetzt bereitgestellt, indem die entsprechende Protokollierungsstufe für das mod_rewrite-Modul mithilfe der LogLevel- Direktive konfiguriert wird . Siehe auch den Abschnitt zur Protokollierung von mod_rewrite.

Weitere Informationen zu LogLevel finden Sie in der LogLevel-Richtlinie

Sie können erreichen

RewriteLog "/path/to/rewrite.log"

auf diese Weise jetzt

LogLevel debug rewrite_module:debug
ThinkingMonkey
quelle
Ok, das Problem ist also, ich versuche, der .htaccess-Datei eine Umschreibung hinzuzufügen, und aus irgendeinem Grund wird sie nicht verwendet.
Macha
@macha versuchen Sie die obige Methode. Wenn Sie einen internen Serverfehler erhalten, bedeutet dies, dass mod_rewrite (.htaccess) aktiviert ist. Sind Sie auf einem gemeinsam genutzten Host?
ThinkingMonkey
Nein, ich arbeite an meinem lokalen Host. Haben Sie eine Vorstellung davon, wann die .htaccess-Datei geladen wird? Ich
dachte,
@macha .htaccess-Dateien werden nie geladen. Auf sie wird (falls vorhanden) von Apache zugegriffen, wenn Sie versuchen, auf eine Seite zuzugreifen, die in diesem Ordner vorhanden ist.
ThinkingMonkey
ok meine frage war, wenn jemand eine webseite anfordert, geht apache direkt zu den serverseitigen skripten oder würde es nach der .htaccess-datei in diesem ordner suchen und dann fortfahren ??
Macha
52

Die Antwort "Junk-Wert eingeben" hat mir nicht geholfen, meine Website wurde trotz des eingegebenen Junk-Werts weiter geladen.

Stattdessen habe ich die folgende Zeile oben in die .htaccess-Datei eingefügt:

deny from all

Dadurch erfahren Sie schnell, ob .htaccess abgeholt wird oder nicht. Wenn der .htaccess verwendet wird, werden die Dateien in diesem Ordner überhaupt nicht geladen.

Caitriona
quelle
4
Dies ist der einfachste Test, wenn es Ihnen nichts ausmacht, während der Überprüfung einige Sekunden lang nichts zu arbeiten.
Mordred
1
Ja, ich habe ungefähr eine Sekunde gebraucht, um zu überprüfen, ob die Site, an der ich gearbeitet habe, keine .htaccess-Dateien verwendet.
Bonh
1
Danke, funktioniert wie ein Zauber :) hat mir einige Zeit beim Debuggen gespart!
Martijn van Hoof
32

Im Allgemeinen sollte jede Änderung des .htaccess sichtbare Auswirkungen haben. Wenn dies keine Auswirkung hat, überprüfen Sie Ihre Apache-Konfigurationsdateien wie folgt:

<Directory ..>
    ...
    AllowOverride None
    ...
</Directory>

Sollte geändert werden zu

AllowOverride All

Und Sie können Anweisungen in .htaccess-Dateien ändern.

jgpATs2w
quelle
Vielen Dank. Ich fand den relevanten Abschnitt in der Hauptdatei apache2.conf für den Verzeichnisbaum / var / www
Tim Richardson
6

Eine logischere Methode wäre möglicherweise, eine Datei (z. B. test.html) zu erstellen, Inhalte hinzuzufügen und dann zu versuchen, sie als Indexseite festzulegen:

DirectoryIndex test.html

Zum größten Teil überschreibt die .htaccess-Regel die Apache-Konfiguration, wenn auf Verzeichnis- / Dateiebene gearbeitet wird

Cez
quelle
4

Um die erste der drei gestellten Fragen zu beantworten, können Sie auf einfache Weise feststellen, ob die .htaccess-Datei funktioniert oder nicht, indem Sie einen benutzerdefinierten Fehler oben in der .htaccess-Datei auslösen:

ErrorDocument 200 "Hello. This is your .htaccess file talking."
RewriteRule ^ - [L,R=200]

Bei Ihrer zweiten Frage: Wenn die .htaccess-Datei nicht gelesen wird, ist möglicherweise die Apache-Hauptkonfiguration des Servers auf AllowOverrideeingestellt None. In der Dokumentation von Apache finden Sie Tipps zur Fehlerbehebung für diesen und andere Fälle, die möglicherweise verhindern, dass der .htaccess wirksam wird.

Um Ihre dritte Frage zu beantworten: Wenn Sie bestimmte Variablen debuggen müssen, auf die Sie in Ihrer Umschreiberegel verweisen, oder einen Ausdruck verwenden , den Sie unabhängig von der Regel auswerten möchten, können Sie Folgendes tun:

Geben Sie die Variable aus, auf die Sie verweisen, um sicherzustellen, dass sie den erwarteten Wert hat:

ErrorDocument 200 "Request: %{THE_REQUEST} Referrer: %{HTTP_REFERER} Host: %{HTTP_HOST}"
RewriteRule ^ - [L,R=200]

Testen Sie den Ausdruck unabhängig, indem Sie ihn in eine <If>Richtlinie aufnehmen. Auf diese Weise können Sie sicherstellen, dass Ihr Ausdruck richtig geschrieben ist oder übereinstimmt, wenn Sie Folgendes erwarten:

<If "%{REQUEST_URI} =~ /word$/">
    ErrorDocument 200 "Your expression is priceless!"
    RewriteRule ^ - [L,R=200]
</If>

Viel Spaß beim Debuggen von .htaccess!

PeterA
quelle
3

Wenn Sie Zugriff auf das Apache Bin-Verzeichnis haben, das Sie verwenden können,

httpd -M um zuerst geladene Module zu überprüfen.

 info_module (shared)
 isapi_module (shared)
 log_config_module (shared)
 cache_disk_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 proxy_module (shared)
 proxy_ajp_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 socache_shmcb_module (shared)
 ssl_module (shared)
 status_module (shared)
 version_module (shared)
 php5_module (shared)

Danach mögen Options -Indexesoder deny from allwerden einfache Anweisungen festigen, dass .htaccess korrekt funktioniert.

Abhishek Gurjar
quelle
1

Um Ihre Regeln für das Umschreiben von htaccess zu testen, geben Sie einfach die URL ein, auf die Sie die Regeln anwenden, platzieren Sie den Inhalt Ihres htaccess im größeren Eingabebereich und klicken Sie auf die Schaltfläche "Test".

http://htaccess.mwl.be/

Ganesh Kandu
quelle
-1

Warum nicht etwas Müll in Ihre .htaccess-Datei einfügen und versuchen, Apache neu zu laden? Wenn Apache nicht gestartet werden kann, wissen Sie, dass es funktioniert. Entfernen Sie den Junk und laden Sie Apache neu, wenn die von Ihnen konfigurierten Glückwünsche .htaccess korrekt geladen werden.

Ben Rabidou
quelle
7
Ich glaube nicht, dass Apache nicht gestartet oder ausgeführt werden kann, wenn ein fehlerhafter .htaccess vorliegt, da .htaccess erst überprüft wird, wenn eine Seitenanforderung vorliegt.
Andrew