Viele Poster haben Probleme beim Debuggen ihrer RewriteRule- und RewriteCond-Anweisungen in ihren .htaccess
Dateien. Die meisten von ihnen verwenden einen gemeinsam genutzten Hosting-Dienst und haben daher keinen Zugriff auf die Root-Server-Konfiguration. Sie können die Verwendung von .htaccess
Dateien zum Umschreiben nicht vermeiden und können ein RewriteLogLevel nicht aktivieren ", wie viele Befragte vorschlagen. Außerdem gibt es viele .htaccess
spezifische Fallstricke und Einschränkungen, die nicht gut abgedeckt sind. Das Einrichten eines lokalen Test-LAMP-Stapels erfordert für die meisten zu viel Lernaufwand .
Meine Frage hier ist also, wie wir empfehlen würden, dass sie ihre Regeln selbst debuggen . Ich gebe unten einige Vorschläge. Andere Vorschläge wären willkommen.
Verstehen Sie, dass die mod_rewrite-Engine
.htaccess
Dateien durchläuft . Der Motor führt diese Schleife aus:do execute server and vhost rewrites (in the Apache Virtual Host Config) find the lowest "Per Dir" .htaccess file on the file path with rewrites enabled if found(.htaccess) execute .htaccess rewrites (in the user's directory) while rewrite occurred
Ihre Regeln werden also wiederholt ausgeführt. Wenn Sie den URI-Pfad ändern, werden möglicherweise andere
.htaccess
Dateien ausgeführt, sofern diese vorhanden sind. Stellen Sie daher sicher, dass Sie diese Schleife beenden, falls erforderlich, indem Sie zusätzliche hinzufügen, um das AuslösenRewriteCond
von Regeln zu stoppen. Löschen Sie auch alle.htaccess
Regelsätze zum Umschreiben auf niedrigerer Ebene, es sei denn, Sie möchten ausdrücklich mehrstufige Regelsätze verwenden.Stellen Sie sicher, dass die Syntax jedes Regexp korrekt ist, indem Sie anhand einer Reihe von Testmustern testen, ob diese eine gültige Syntax ist und mit einer Reihe von Test-URIs das tut, was Sie beabsichtigen. Siehe Antwort unten für weitere Details.
Erstellen Sie Ihre Regeln schrittweise in einem Testverzeichnis. Sie können die Funktion "Die tiefste
.htaccess
Datei auf dem Pfad ausführen " verwenden, um hier ein separates Testverzeichnis (Baum) einzurichten und Regelsätze zu debuggen, ohne Ihre Hauptregeln zu vermasseln und die Arbeit Ihrer Site zu stoppen. Sie müssen sie einzeln hinzufügen, da dies die einzige Möglichkeit ist, Fehler in einzelnen Regeln zu lokalisieren.Verwenden Sie einen Dummy-Skript-Stub, um Server- und Umgebungsvariablen auszugeben . (Siehe Listing 2 ) Wenn Ihre App beispielsweise verwendet,
blog/index.php
können Sie diese kopierentest/blog/index.php
und zum Testen Ihrer Blog-Regeln imtest
Unterverzeichnis verwenden. Sie können auch Umgebungsvariablen verwenden, um sicherzustellen, dass die Rewrite-Engine die Substitutionszeichenfolgen korrekt interpretiert, zRewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]
und suchen Sie nach diesen REDIRECT_ * -Variablen im phpinfo-Dump. Übrigens habe ich dieses verwendet und auf meiner Website festgestellt, dass ich es
%{ENV:DOCUMENT_ROOT_REAL}
stattdessen verwenden musste. Im Fall einer Redirector-Schleife listen die Variablen REDIRECT_REDIRECT_ * den vorherigen Durchgang auf. Etc..Stellen Sie sicher, dass Sie nicht von Ihrem Browser gebissen werden, der falsche 301-Weiterleitungen zwischenspeichert . Siehe Antwort unten . Mein Dank geht an Ulrich Palha dafür.
Die Rewrite-Engine scheint empfindlich auf kaskadierte Regeln innerhalb eines
.htaccess
Kontexts zu reagieren (hierRewriteRule
führt dies zu einer Substitution und dies fällt jedoch auf weitere Regeln), da ich Fehler mit internen Unteranforderungen (1) und eine falsche PATH_INFO- Verarbeitung gefunden habe, die häufig auftreten kann wird durch Verwendung der Flags [NS], [L] und [PT] verhindert.
Noch mehr Kommentare oder Vorschläge?
Listing 1 - phpinfo
<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);
quelle
Antworten:
Hier sind einige zusätzliche Tipps zum Testen von Regeln, die das Debuggen für Benutzer auf Shared Hosting erleichtern können
1. Verwenden Sie einen Fake-User-Agenten
Fügen Sie beim Testen einer neuen Regel eine Bedingung hinzu, um sie nur mit einem
fake
Benutzeragenten auszuführen , den Sie für Ihre Anforderungen verwenden. Auf diese Weise wirkt sich dies nicht auf andere Personen auf Ihrer Website aus.z.B
Wenn Sie Firefox verwenden, können Sie mit dem User Agent Switcher die gefälschte User Agent-Zeichenfolge erstellen und testen.
2. Verwenden Sie 301 erst, wenn Sie mit dem Testen fertig sind
Ich habe so viele Posts gesehen, in denen Leute immer noch ihre Regeln testen und 301s verwenden. NICHT .
Wenn Sie auf Ihrer Website nicht Vorschlag 1 verwenden, sind nicht nur Sie, sondern alle Personen, die Ihre Website zu diesem Zeitpunkt besuchen, von der 301 betroffen.
Denken Sie daran, dass sie permanent sind und von Ihrem Browser aggressiv zwischengespeichert werden. Verwenden Sie stattdessen eine 302, bis Sie sicher sind, und ändern Sie sie dann in eine 301.
3. Denken Sie daran, dass 301 in Ihrem Browser aggressiv zwischengespeichert werden
Wenn Ihre Regel nicht funktioniert und für Sie richtig aussieht und Sie die Vorschläge 1 und 2 nicht verwendet haben, testen Sie sie erneut, nachdem Sie Ihren Browser-Cache geleert haben oder während Sie privat surfen.
4. Verwenden Sie ein HTTP-Erfassungstool
Verwenden Sie ein HTTP-Erfassungstool wie Fiddler , um den tatsächlichen HTTP-Verkehr zwischen Ihrem Browser und dem Server anzuzeigen.
Während andere sagen könnten, dass Sie es sind
site does not look right
, können Sie dies stattdessen sehen und meldenall of the images, css and js are returning 404 errors
und das Problem schnell eingrenzen.Während andere Ihnen dies melden, können Sie
started at URL A and ended at URL C
sehen, dass sie bei begonnen habenURL A, were 302 redirected to URL B and 301 redirected to URL C
. Selbst wenn URL C das ultimative Ziel war, werden Sie wissen, dass dies schlecht für SEO ist und behoben werden muss.Sie können Cache-Header anzeigen, die auf der Serverseite festgelegt wurden, Anforderungen wiedergeben, Anforderungsheader zum Testen ändern ....
quelle
[L,R=302]
[L, R=302]
nur[L,R]
die Standardeinstellung ist302
Online-Test zum Umschreiben von .htaccess
Ich habe diese Googling for RegEx-Hilfe gefunden. Sie hat mir viel Zeit gespart, da ich bei
.htaccess
jeder kleinen Änderung neue Dateien hochladen musste .von der Website:
quelle
Vergessen Sie nicht, dass es sich bei .htaccess-Dateien um eine relative URL handelt, die übereinstimmt.
In einer .htaccess-Datei stimmt die folgende RewriteRule niemals überein:
quelle
/
Zeichenfolgen entfernt. Dieses Entfernen erfolgt jedoch nicht für Übereinstimmungszeichenfolgen, die in Rewrite Cond- Befehlen zusammengestellt wurden.Stellen Sie sicher, dass die Syntax jedes Regexp korrekt ist
Testen Sie anhand einer Reihe von Testmustern, um sicherzustellen, dass dies eine gültige Syntax ist und dass Sie mit einer ganzen Reihe von Test-URIs das tun, was Sie beabsichtigen.
Sehen Datei regexpCheck.php finden Sie ein einfaches Skript, das Sie einem privaten / Testverzeichnis auf Ihrer Site hinzufügen können, um dies zu unterstützen. Ich habe mich eher kurz als hübsch gehalten. Fügen Sie dies einfach in eine Datei
regexpCheck.php
in einem Testverzeichnis ein, um es auf Ihrer Website zu verwenden. Auf diese Weise können Sie reguläre Ausdrücke erstellen und diese anhand einer Liste von Testfällen testen. Ich verwende hier die PHP-PCRE-Engine, aber nachdem ich mir die Apache-Quelle angesehen habe, ist diese im Grunde identisch mit der in Apache verwendeten. Es gibt viele HowTos und Tutorials, die Vorlagen bereitstellen und Ihnen beim Aufbau Ihrer Regexp-Fähigkeiten helfen können.Listing 1 - regexpCheck.php
quelle
import_request_variables
wurde in PHP 5.3 veraltet und in 5.4 entfernt.extract($_GET)
gekoppelt mitextract($_POST)
kann dieselbe Funktion ausführen, aber für alle Variablen müsste das Präfix aus ihrem Namen entfernt werden. Quelle: php.net/manual/en/function.import-request-variables.phpStellen Sie sicher, dass Sie das Prozentzeichen vor Variablen verwenden, nicht das Dollarzeichen.
Es ist
%{HTTP_HOST}
, nicht${HTTP_HOST}
. Es wird nichts im error_log geben, es wird keine internen Serverfehler geben, Ihr regulärer Ausdruck ist immer noch korrekt, die Regel stimmt einfach nicht überein. Dies ist wirklich abscheulich, wenn Sie viel mit Django / Genshi-Vorlagen arbeiten und eine${}
variable Substitution im Muskelgedächtnis haben.quelle
Eine von ein paar Stunden, die ich verschwendet habe:
Wenn Sie alle diese Tipps angewendet haben und nur 500 Fehler auftreten, weil Sie keinen Zugriff auf das Serverfehlerprotokoll haben, liegt das Problem möglicherweise nicht im .htaccess, sondern in den Dateien, zu denen es umleitet.
Nachdem ich mein .htaccess-Problem behoben hatte, verbrachte ich noch zwei Stunden damit, es noch einmal zu beheben, obwohl ich einfach einige Berechtigungen vergessen hatte.
quelle
.htaccess
Probleme zu diagnostizieren .Legen Sie Umgebungsvariablen fest und verwenden Sie Header, um sie zu empfangen:
Sie können neue Umgebungsvariablen mit RewriteRule-Zeilen erstellen, wie von OP erwähnt:
Aber wenn Sie ein serverseitiges Skript nicht zum Laufen bringen können, wie können Sie dann diese Umgebungsvariable lesen? Eine Lösung besteht darin, einen Header zu setzen:
Der Wert akzeptiert Formatbezeichner , einschließlich des
%{NAME}e
Bezeichners für Umgebungsvariablen (vergessen Sie nicht den Kleinbuchstaben e). Manchmal müssen Sie dasREDIRECT_
Präfix hinzufügen , aber ich habe nicht herausgefunden, wann das Präfix hinzugefügt wird und wann nicht.quelle
REDIRECT_
Präfix verwendet werden soll oder nicht ? Ich sehe auch Terminologie über Präfixe in anderen (htaccess) Kontexten, aber es war nie klar, was genau gemeint ist. Bedeutet dies, dass Sie Ihre Variable mit dem Präfix benennen oder das Präfix zu Ihrer benannten Variablen hinzufügen müssen, wenn Sie bestimmte Befehle (aber keine anderen Befehle) verwenden? Ihr Beispiel ist das erste , das sowohl die Var-Definition als auch die Var-Verwendung zeigt. Daher neige ich dazu, an Letzteres zu denken! Die Dokumente waren wenig hilfreich - sie gehen davon aus, dass wir zu viel wissen und zu wenig Referenzen / Links angeben.Wenn Sie Umleitungen erstellen, testen Sie mit Curl , um Probleme beim Zwischenspeichern des Browsers zu vermeiden. Verwenden Sie -I, um nur http-Header abzurufen. Verwenden Sie -L, um alle Weiterleitungen zu verfolgen.
quelle
Ich habe diese Frage gefunden, als ich versucht habe, meine mod_rewrite-Probleme zu debuggen, und sie enthält definitiv einige hilfreiche Ratschläge. Am Ende ist es jedoch am wichtigsten, sicherzustellen, dass Ihre Regex-Syntax korrekt ist. Aufgrund von Problemen mit meiner eigenen RE-Syntax war die Installation des Skripts regexpCheck.php keine praktikable Option.
Da Apache jedoch PCREs (Perl-Compatible Regular Expressions) verwendet, sollte jedes Tool, das beim Schreiben von PCREs hilft, hilfreich sein. Ich habe in der Vergangenheit das Tool von RegexPlanet mit Java- und Javascript-REs verwendet und war froh, dass sie auch Perl unterstützen.
Geben Sie einfach Ihren regulären Ausdruck und eine oder mehrere Beispiel-URLs ein und Sie erfahren, ob der reguläre Ausdruck übereinstimmt (eine "1" in der Spalte "~ =") und gegebenenfalls übereinstimmende Gruppen (die Zahlen in der "Aufteilung"). Die Spalte entspricht den Zahlen, die Apache erwartet, z. B. $ 1, $ 2 usw.) für jede URL. Sie behaupten, die PCRE-Unterstützung sei "in der Beta", aber es war genau das, was ich brauchte, um meine Syntaxprobleme zu lösen.
http://www.regexplanet.com/advanced/perl/index.html
Ich hätte einer vorhandenen Antwort einfach einen Kommentar hinzugefügt, aber mein Ruf ist noch nicht auf diesem Niveau. Hoffe das hilft jemandem.
quelle
In Bezug auf 4. müssen Sie immer noch sicherstellen, dass Ihr "Dummy-Skript-Stub" tatsächlich die Ziel-URL ist, nachdem das Umschreiben abgeschlossen ist, sonst sehen Sie nichts!
Ein ähnlicher / verwandter Trick (siehe diese Frage ) ist das Einfügen einer temporären Regel wie:
Wo
show.php
ist ein sehr einfaches Skript, das nur seine anzeigt$_GET
Parameter (Sie können auch Umgebungsvariablen anzeigen, wenn Sie möchten).Dadurch wird das Umschreiben an dem Punkt gestoppt, an dem Sie es in den Regelsatz einfügen, ähnlich wie bei einem Haltepunkt in einem Debugger.
Wenn Sie Apache <2.3.9 verwenden, müssen Sie
[L]
statt verwenden[END]
, und Sie müssen möglicherweise Folgendes hinzufügen:Ganz oben in Ihrem Regelsatz, wenn die URL
/show.php
selbst neu geschrieben wird.quelle
Einige Fehler, die ich beobachtet habe, passieren beim Schreiben
.htaccess
Verwendung von
^(.*)$
wiederholt in mehreren Regeln, mit^(.*)$
dass andere Regeln in den meisten Fällen machtlos sind, da sie mit der gesamten URL in einem einzigen Treffer übereinstimmen.Wenn wir also eine Regel für diese URL verwenden
sapmle/url
, wird diese URL ebenfalls verwendetsapmle/url/string
.[L]
Das Flag sollte verwendet werden, um sicherzustellen, dass unsere Regel verarbeitet wurde.Sollte wissen über:
Unterschied in% n und $ n
%n
wird während des%{RewriteCond}
Teils abgeglichen und$n
entspricht dem%{RewriteRule}
Teil.Funktionieren von RewriteBase
quelle
Wenn Sie mehr als nur eine Regelzeile in .htacesss schreiben möchten,
denken Sie nicht einmal daran, eine dieser Hotfix -Methoden zum Debuggen auszuprobieren .
Ich habe Tage damit verschwendet, mehrere Regeln ohne Feedback von LOGs festzulegen, um schließlich aufzugeben.
Ich habe Apache auf meinem PC installiert, die gesamte Site auf die Festplatte kopiert und den gesamten Regelsatz mithilfe der Protokolle sehr schnell aussortiert.
Dann überprüfte ich meine alten Regeln, die funktionierten. Ich sah, dass sie nicht wirklich das taten, was gewünscht wurde. Eine Zeitbombe mit einer etwas anderen Adresse.
Es gibt so viele Grubenstürze bei Umschreiberegeln, dass es überhaupt keine logische Sache ist.
Sie können Apache in zehn Minuten zum Laufen bringen, es ist 10 MB groß, eine gute Lizenz, * NIX / WIN / MAC bereit, auch ohne Installation.
Überprüfen Sie auch die Kopfzeilen Ihres Servers und holen Sie sich dieselbe Version von Apache aus dem Archiv, falls diese alt ist. Mein OP ist immer noch auf 2.0; Viele Dinge werden nicht unterstützt.
quelle
mod_rewrite
Regeln definiert worden wäre, aber die Eröffnung "Denken Sie nicht einmal darüber nach" ist einfach ein schlechter Rat für Benutzer von Shared Services, die Schwierigkeiten haben zu verstehen, warum ihrehtaccess
Dateien nicht vorhanden sind. nicht so arbeiten, wie sie es sollten..htaccess
Dateien zu installieren ", ist dies ausgewogener. Ja, es ist relativ einfach, einen lokalen Apache-Dienst einzurichten, aber es kann kompliziert sein, ihn so zu gestalten, dass er den gemeinsam genutzten Hosting-Dienst eines Dienstanbieters widerspiegelt. sagen, und haben Probleme mit ihrer.htaccess
Datei.Ich werde das hier belassen , vielleicht ein offensichtliches Detail, aber ich habe stundenlang mit dem Kopf geschlagen: Sei vorsichtig,
%{REQUEST_URI}
denn was @Krist van Besien in seiner Antwort sagt, ist völlig richtig, aber nicht für die REQUEST_URI-Zeichenfolge , weil das Ergebnis ist TestString beginnt mit a/
. Also pass auf dich auf:quelle
(Ähnlich wie bei der Doin-Idee) Um zu zeigen, was übereinstimmt, verwende ich diesen Code
Speichern Sie es in r.php im Server-Stammverzeichnis und führen Sie dann einige Tests in .htaccess durch
. Beispielsweise möchte ich URLs abgleichen, die nicht mit einem Sprachpräfix beginnen
quelle
QUERY_STRING
Wie von @JCastell hervorgehoben, kann der Online-Tester einzelne Weiterleitungen anhand einer .htaccess-Datei gut testen. Interessanter ist jedoch die API , die zum Batch-Testen einer Liste von URLs mit einem JSON-Objekt verwendet werden kann. Um es jedoch nützlicher zu machen, habe ich eine kleine Bash-Skriptdatei geschrieben, die curl und jq verwendet , um eine Liste von URLs zu senden und die json-Antwort in eine CSV-formatierte Ausgabe zu analysieren, deren Zeilennummer und Regel in der htaccess-Datei übereinstimmen Zusammen mit der umgeleiteten URL ist es sehr praktisch, eine Liste von URLs in einer Tabelle zu vergleichen und schnell festzustellen, welche Regeln nicht funktionieren.
quelle
Wenn Sie mit URL arbeiten, möchten Sie möglicherweise überprüfen, ob Sie "Mod Rewrite aktivieren" aktivieren.
quelle