Tipps zum Debuggen von .htaccess-Regeln zum Umschreiben


272

Viele Poster haben Probleme beim Debuggen ihrer RewriteRule- und RewriteCond-Anweisungen in ihren .htaccessDateien. 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 .htaccessDateien zum Umschreiben nicht vermeiden und können ein RewriteLogLevel nicht aktivieren ", wie viele Befragte vorschlagen. Außerdem gibt es viele .htaccessspezifische 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.

  1. Verstehen Sie, dass die mod_rewrite-Engine .htaccessDateien 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 .htaccessDateien 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ösen RewriteCondvon Regeln zu stoppen. Löschen Sie auch alle .htaccessRegelsätze zum Umschreiben auf niedrigerer Ebene, es sei denn, Sie möchten ausdrücklich mehrstufige Regelsätze verwenden.

  2. 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.

  3. Erstellen Sie Ihre Regeln schrittweise in einem Testverzeichnis. Sie können die Funktion "Die tiefste .htaccessDatei 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.

  4. Verwenden Sie einen Dummy-Skript-Stub, um Server- und Umgebungsvariablen auszugeben . (Siehe Listing 2 ) Wenn Ihre App beispielsweise verwendet, blog/index.phpkönnen Sie diese kopieren test/blog/index.phpund zum Testen Ihrer Blog-Regeln im testUnterverzeichnis verwenden. Sie können auch Umgebungsvariablen verwenden, um sicherzustellen, dass die Rewrite-Engine die Substitutionszeichenfolgen korrekt interpretiert, z

    RewriteRule ^(.*) - [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..

  5. 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.

  6. Die Rewrite-Engine scheint empfindlich auf kaskadierte Regeln innerhalb eines .htaccessKontexts zu reagieren (hier RewriteRulefü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);

10
Diese sind gut ... Vielleicht sollten Sie sie von der Frage in eine Antwort verschieben.
w00t

@ w00t, ich habe den Regexp-Checker gemäß Ihrem Vorschlag abgespalten, weil ich ihn in anderen Antworten per Link weiterleiten möchte.
TerryE

3
Möglicherweise möchten Sie das Kontrollflussdiagramm aus den Dokumenten zu Ihrem ersten Vorschlag hinzufügen . IMO ist es viel einfacher zu verstehen als jeder Pseudocode oder jede Erklärung, und dies ist wirklich der schwärzeste Teil des Mod-Rewrite-Voodoos.
Samstag,

Nummer 6 ist eine große Sache. Rewrite-Regeln, die sich in Standard-Apache-Konfigurationsdateien anders verhalten als in .htaccess-Dateien, müssen viele Leute herausholen.
Iain Collins

Etwas, das es wert sein könnte, diesen Hinweisen hinzugefügt zu werden: Ich habe einige Zeit damit verbracht, ein Problem mit der Umleitung und nicht dem Umschreiben zu debuggen. Es stellte sich heraus, dass ich es in "/ comment" umschreiben ließ, als ich "/ comment /" wollte. Es wurde in "/ comment" umgeschrieben und dann führte der Server eine Umleitung zu "/ comment /" durch. Offensichtliches Verhalten gegenüber denen, die an Apache gewöhnt sind, aber wahrscheinlich weniger für Noobs wie mich.
Chris

Antworten:


132

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 fakeBenutzeragenten 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

#protect with a fake user agent
RewriteCond %{HTTP_USER_AGENT}  ^my-fake-user-agent$
#Here is the actual rule I am testing
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC] 
RewriteRule ^ http://www.domain.com%{REQUEST_URI} [L,R=302] 

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 melden all of the images, css and js are returning 404 errorsund das Problem schnell eingrenzen.

Während andere Ihnen dies melden, können Sie started at URL A and ended at URL Csehen, dass sie bei begonnen haben URL 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 ....



9
Ulrich, vielen Dank für diesen Beitrag. Sie haben einige Aspekte aufgegriffen, an deren Aufnahme ich nicht gedacht hatte. Beim 301-Debugging-Problem verwende ich Chrome im "Private Browsing" (AKA "Porno-Modus"), da diese Statusinformationen beim Schließen des Fensters ausgegeben werden. Ich hoffe, dass es Ihnen nichts ausmacht, wenn ich dies nicht als wichtigen Punkt "akzeptiere", aber keine einzige beste Antwort. Danke noch einmal. :)
TerryE

1
Um es klar zu machen (Sie haben es in Ihrem Code, haben es aber nicht entdeckt), aber um sicherzustellen, dass Sie eine 302 nicht 301-Umleitung verwenden, die Sie benötigen[L,R=302]
icc97

6
Sie müssen nicht explizit angeben, [L, R=302]nur [L,R]die Standardeinstellung ist302
Rahil Wazir

2
@goodeye, sehen Sie sich auch das Kontrollkästchen "Chrome> Einstellungen> Allgemein> Cache deaktivieren, während DevTools geöffnet ist" an.
Johnsnails

83

Online-Test zum Umschreiben von .htaccess

Ich habe diese Googling for RegEx-Hilfe gefunden. Sie hat mir viel Zeit gespart, da ich bei .htaccessjeder kleinen Änderung neue Dateien hochladen musste .

von der Website:

htaccess-Tester

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 "Jetzt prüfen".


6
Vielen Dank für den Hinweis auf dieses Tool, mit dem ich mein Problem am direktesten beheben konnte.
BobHy

Wenn Sie SSH-Zugriff auf Ihren Webspace haben, können Sie den .htaccess auch direkt über den Editor auf dem Server ändern.
Sjas

Sie müssen die SSL-Warnung ignorieren, da das Site-Zertifikat Probleme aufweist. Aber die Seite ist immer noch da. Dies ist die beste und einfachste Lösung. Es gibt einen unglaublichen Einblick in das, was falsch ist und führt dazu, dass das Problem SCHNELL behoben wird.
Toddmo

Vielen Dank für den Hinweis auf dieses Tool. Es ist hilfreich, manchmal ist das Debuggen des Apache htaccess selbst sooo verdammt schwer. Vielen Dank. Vielen Dank
Benyamin Limanto

Der Link, auf den verwiesen wird, scheint fehlerhaft zu sein und gibt Ihnen nicht immer die genaue Ausgabe. Bitte überprüfen Sie den tatsächlichen Apache, um absolut sicher zu sein.
Parth

13

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:

RewriteRule ^/(.*)     /something/$s

4
Ja, die Zeichenfolge wurde in eine Umschreiberegel eingegeben ist relativ und wird daher bei allen führenden /Zeichenfolgen entfernt. Dieses Entfernen erfolgt jedoch nicht für Übereinstimmungszeichenfolgen, die in Rewrite Cond- Befehlen zusammengestellt wurden.
TerryE

8

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.phpin 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

<html><head><title>Regexp checker</title></head><body>
<?php 
    $a_pattern= isset($_POST['pattern']) ? $_POST['pattern'] : "";
    $a_ntests = isset($_POST['ntests']) ? $_POST['ntests'] : 1;
    $a_test   = isset($_POST['test']) ? $_POST['test'] : array();

    $res = array(); $maxM=-1; 
    foreach($a_test as $t ){
        $rtn = @preg_match('#'.$a_pattern.'#',$t,$m);
        if($rtn == 1){
            $maxM=max($maxM,count($m));
            $res[]=array_merge( array('matched'),  $m );
        } else {
            $res[]=array(($rtn === FALSE ? 'invalid' : 'non-matched'));
        }
    } 
?> <p>&nbsp; </p>
<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME'];?>">
    <label for="pl">Regexp Pattern: </label>
    <input id="p" name="pattern" size="50" value="<?php echo htmlentities($a_pattern,ENT_QUOTES,"UTF-8");;?>" />
    <label for="n">&nbsp; &nbsp; Number of test vectors: </label>
    <input id="n" name="ntests"  size="3" value="<?php echo $a_ntests;?>"/>
    <input type="submit" name="go" value="OK"/><hr/><p>&nbsp;</p>
    <table><thead><tr><td><b>Test Vector</b></td><td>&nbsp; &nbsp; <b>Result</b></td>
<?php 
    for ( $i=0; $i<$maxM; $i++ ) echo "<td>&nbsp; &nbsp; <b>\$$i</b></td>";
    echo "</tr><tbody>\n";
    for( $i=0; $i<$a_ntests; $i++ ){
        echo '<tr><td>&nbsp;<input name="test[]" value="', 
            htmlentities($a_test[$i], ENT_QUOTES,"UTF-8"),'" /></td>';
        foreach ($res[$i] as $v) { echo '<td>&nbsp; &nbsp; ',htmlentities($v, ENT_QUOTES,"UTF-8"),'&nbsp; &nbsp; </td>';}
        echo "</tr>\n";
    }
?> </table></form></body></html>

1
Kurzer Hinweis: import_request_variableswurde in PHP 5.3 veraltet und in 5.4 entfernt. extract($_GET)gekoppelt mit extract($_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.php
Jeff Lambert

@watcher, danke. Ich hatte meine lokale Version vor einem Jahr auf 5.4-kompatibel aktualisiert, aber vergessen, diesen Beitrag zu ändern. Jetzt fertig.
TerryE

Oh mein Gott, auch nach dem Bearbeiten kann ich keine guten Ergebnisse erzielen, wenn ich nur Ihren Code kopiere ... aber mit Regex-Geigern denke ich, dass Ihr Tool sowieso veraltet ist. Schauen Sie sich diese coolen Tools an: regex101.com oder refiddle.com oder regexr.com
hexerei software

@hexereisoftware, dieser Beitrag ist 3 Jahre alt, daher kann es je nach der jetzt verwendeten PHP-Version und der Apache-Version zu subtilen Problemen kommen. Es gibt jedoch viele Varianten von Regexp mit jeweils geringfügigen Unterschieden. Wie gesagt, der Apache-Code verwendet eine PCRE-Engine, die der PHP-Engine sehr ähnlich ist. Ich bin mir nicht sicher, was die Unterschiede zu anderen Varianten wie .Net sind. Obwohl Ihr Vorschlag, eine Online-Ressource zu verwenden, gut ist, würde ich mich an eine halten, die explizit Apache- oder PHP-Syntax unterstützt. :-)
TerryE

Perl wäre ne am nächsten, aber PHP verwendet die gleiche Syntax
Hexerei Software

7

Stellen 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.


1
Ja, die $ Substitutionsvariablen beziehen sich auf das letzte RewriteRule-Muster und die % auf das letzte RewriteCond-Muster und Specials wie% {env: XXX}
TerryE

7

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.


Ich verwende einen Hosting-Webservice mit gemeinsamem Zugriff für meine persönliche Site, aber ich habe eine Test-VM eingerichtet, die dies in Bezug auf die PHP / Apache-Konfiguration, das Home-Verzeichnis usw. grob widerspiegelt. Allerdings, weil diese VM unter meiner admin Ich kann die Protokollierung für das Umschreiben aktivieren, um schwierige .htaccessProbleme zu diagnostizieren .
TerryE

6

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:

RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]

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:

Header set TEST_FOOBAR "%{REDIRECT_TEST0}e"

Der Wert akzeptiert Formatbezeichner , einschließlich des %{NAME}eBezeichners für Umgebungsvariablen (vergessen Sie nicht den Kleinbuchstaben e). Manchmal müssen Sie das REDIRECT_Präfix hinzufügen , aber ich habe nicht herausgefunden, wann das Präfix hinzugefügt wird und wann nicht.


Haben Sie weitere Informationen darüber erhalten, wann das 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.
SherylHohman

5

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.


3

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.


schönes Werkzeug, aber schreckliche Form ... Schauen Sie sich diese coolen Werkzeuge an: regex101.com oder refiddle.com oder regexr.com
hexerei software

3

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:

RewriteRule (.*) /show.php?url=$1 [END]

Wo show.phpist 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:

RewriteRule ^show.php$ - [L]

Ganz oben in Ihrem Regelsatz, wenn die URL /show.phpselbst neu geschrieben wird.


3

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 verwendet sapmle/url/string.


[L] Das Flag sollte verwendet werden, um sicherzustellen, dass unsere Regel verarbeitet wurde.


Sollte wissen über:

Unterschied in% n und $ n

%nwird während des %{RewriteCond}Teils abgeglichen und $nentspricht dem %{RewriteRule}Teil.

Funktionieren von RewriteBase

Die RewriteBase-Direktive gibt das URL-Präfix an, das für RewriteRule-Direktiven pro Verzeichnis (htaccess) verwendet werden soll, die einen relativen Pfad ersetzen.

Diese Anweisung ist erforderlich, wenn Sie einen relativen Pfad in einer Ersetzung im Kontext pro Verzeichnis (htaccess) verwenden, es sei denn, eine der folgenden Bedingungen ist erfüllt:

Die ursprüngliche Anforderung und die Ersetzung befinden sich unter dem DocumentRoot (im Gegensatz dazu, dass sie mit anderen Mitteln wie Alias ​​erreichbar sind). Der Dateisystempfad zu dem Verzeichnis, das die RewriteRule enthält, an das die relative Ersetzung angehängt ist, ist auch als URL-Pfad auf dem Server gültig (dies ist selten). In Apache HTTP Server 2.4.16 und höher kann diese Anweisung weggelassen werden, wenn die Anforderung über Alias ​​oder mod_userdir zugeordnet wird.


2

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.


papo, ich habe in meiner Entwicklungsstruktur dedizierte Server, von ISPs gehostete VPS und private VMs ausgeführt, aber ich verwende immer noch einen gemeinsamen Hosting-Service für meine öffentlichen Domains und E-Mails, einfach weil es bequemer und kostengünstiger ist, eine vollständig verwaltete zu verwenden Service für diese. Dieses Howto richtet sich wirklich an Benutzer von gemeinsam genutzten Diensten. Das Konfigurieren einer privaten VM zum vollständigen Spiegeln eines gemeinsam genutzten Dienstes ist schwierig. Ja, wenn Sie dann eine Test-VM verwenden können, hilft dies, aber ich verwende diese "Tricks" von Zeit zu Zeit für meinen gemeinsam genutzten Dienst.
TerryE

1
Ich würde dem zustimmen, wenn Ihr A als alternativer Vorschlag für Debugging- mod_rewriteRegeln 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 ihre htaccessDateien nicht vorhanden sind. nicht so arbeiten, wie sie es sollten.
TerryE

Es tut mir leid, wenn es so klang, als wäre Ihre Aufgabe, eine schöne Sammlung von Ratschlägen zusammenzustellen, wertlos. Das wollte ich nicht. Glauben Sie mir, ich habe mich sehr gefreut, viele Ratschläge zu lesen und zu befolgen, die dieser Thread angeboten hat. Aber meine Regeln wurden langsam kompliziert und am Ende verschwendete ich viel Zeit, indem ich einfach nicht die Mühe machen wollte, einen Apache-Server zu installieren und das Debuggen so durchzuführen, wie es sein sollte. Darüber hinaus habe ich nichts gelernt, da ich in Protokollen nicht gesehen habe, was wirklich geschah. Und es ist viel los. Ich glaube, es ist auch wertvoll, diese Erfahrung zu teilen.
Papo

Für den zweiten Teil gibt es eine IF. Mein Text begann nie mit "Denk nicht mal darüber nach". Ich sehe jetzt, diese Formulierung scheint ein bisschen hart zu sein, aber es ist alles wahr. Besonders für diejenigen, die neu in diesem Bereich sind und Schwierigkeiten haben zu verstehen. Ratschläge hier könnten sie wie mich irreführen, dass alles, was ich brauche, eine solide Regex ist, es ist nicht so einfach, wie Ihr Punkt 6) PATH_INFO hat mich viel Ärger gekostet und es ist kein Fehler, wie Sie sagen, sondern eine Funktion. Wenn Sie nicht möchten, dass es erneut hinzugefügt wird, verwenden Sie [DPI]. Aber nur wenn Sie sich Protokolle ansehen, werden Sie sehen, dass sie dort hinzugefügt werden. Deshalb mehr als eine Zeile, und Sie sind besser dran, Protokolle zu verwenden
Papo

1
Sorry @papo, aber mein Grund für die -1-Abstimmung war, dass ich denke, dass dies "nicht einmal darüber nachdenken" ein schlechter Rat ist, IMO. Wenn Sie der Meinung waren, dass "ab einer bestimmten Komplexität es möglicherweise einfacher ist, einen lokalen Apache-Dienst zum Debuggen Ihrer .htaccessDateien 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 .htaccessDatei.
TerryE

1

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:

RewriteCond %{REQUEST_URI} ^/assets/$  
                            ^
                            | check this pesky fella right here if missing

0

(Ähnlich wie bei der Doin-Idee) Um zu zeigen, was übereinstimmt, verwende ich diesen Code

$keys = array_keys($_GET);
foreach($keys as $i=>$key){
    echo "$i => $key <br>";
}

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

RewriteRule ^(?!(en|de)/)(.*)$ /r.php?$1&$2 [L] #$1&$2&...
RewriteRule ^(.*)$ /r.php?nomatch [L] #report nomatch and exit

1
Nur einen phpinfo () -Stub zu verwenden, wie ich in Punkt 4 auf meinem O / P erwähnt habe, macht im Grunde das Gleiche. Suchen Sie nachQUERY_STRING
TerryE

0

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.


-1

Wenn Sie mit URL arbeiten, möchten Sie möglicherweise überprüfen, ob Sie "Mod Rewrite aktivieren" aktivieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.