Warum funktioniert die Weiterleitung in .htaccess nicht?

Warum funktioniert die Weiterleitung in .htaccess nicht?

Ich habe eine Wordpress-Website. Ich möchte .php-URLs auf solche ohne das Suffix .php umleiten. Die .htaccess-Datei lautet wie folgt:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On


RewriteRule ^(.*)\.php$ "$1" [R=301,L,NC]


RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Aber wenn ich besuchehttps://www.example.com/somepage.php, die Seite kann nicht angezeigt werden. Der folgende Fehler wird im Browser angezeigt:

The page isn’t redirecting properly

    An error occurred during a connection to www.example.com.
    
        This problem can sometimes be caused by disabling or refusing to accept cookies.

Und die URL in der Adressleiste wird https://www.example.com/index.

Wenn ich die Umschreiberegel wie folgt ändere:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On


RewriteRule ^(.*)\.html$ "$1" [R=301,L,NC]


RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Und besuchenhttps://www.example.com/eineSeite.html, es wird erfolgreich umgeleitet zuhttps://www.example.com/eineSeiteund die Webseite wird normal angezeigt. Warum?

Antwort1

Denn da die Umleitungbedingungslos, Sie werden am Ende wieder umgeleitetnachDie URL wurde umgeschrieben auf index.php(den WordPress-Front-Controller).

Wenn Sie Folgendes anfordern /somepage.php:

  1. Sie werden umgeleitet /somepage(gemäß der ersten Regel). Die Umleitungsantwort wird an den Client zurückgesendet.
  2. Bei der zweiten Anforderung /somepagewird intern nach /index.phpder letzten Regel umgeschrieben. Die Umschreibe-Engine startet dann von vorne (in einemVerzeichnisKontext)...
  3. /index.phpumgeleitet wird /index(gemäß der ersten Regel). Die Umleitungsantwort wird an den Client zurückgesendet.
  4. Bei der dritten Anforderung wird intern durch das letzte Umschreiben /indexumgeschrieben . Die Umschreib-Engine beginnt dann von vorne.../index.php
  5. Gehe zu 3 (stecke in einer endlosen Umleitungsschleife fest).

In einemVerzeichnisKontext (wie .htaccess) führt die Umschreib-Engine das Skript nicht einfach einmal durch. Sie wiederholt es, bis die URL unverändert durchgeht. (Es sei denn, Sie verwenden das ENDFlag bei Apache 2.4 oder es erfolgt eine externe 3xx-Umleitung.)

Die Änderung in "entfernen" .htmlfunktioniert einwandfrei, da Sie in umschreiben /index.php, das nicht mit endet . Daher stimmt .htmldie Umleitungsdirektive (die "entfernt ") nicht überein..html

Um dieses Problem zu beheben, müssen Sie die Umleitung der neu geschriebenen Anfrage vermeiden. Dies können Sie folgendermaßen tun:

  • Verwenden des ENDFlags (Apache 2.4+) beim letzten Umschreiben, anstatt Lweitere Schleifen der Umschreib-Engine zu verhindern. Obwohl Sie es vermeiden sollten, die Standardanweisungen von WordPress zu ändern (siehe unten), ist dies möglicherweise nicht die bevorzugte Option. Dies funktioniert auch nicht unter Apache 2.2.

  • Oder überprüfen Sie die .phpErweiterung anhand THE_REQUESTder Servervariable (die die Anfangszeile der HTTP-Anforderungsheader enthält und sich beim Umschreiben der Anforderung nicht ändert). Beispiel:

    # Remove ".php" extension on "direct" (not rewritten) requests only
    RewriteCond %{THE_REQUEST} [A-Z]{3,7}\s/[^?]+\.php(?:\?|\s|$) [NC]
    RewriteRule (.+)\.php$ /$1 [R=301,L,NC]
    
  • Oder überprüfen Sie die REDIRECT_STATUSUmgebungsvariable, die bei der ersten Anfrage leer ist und beim ersten erfolgreichen Umschreiben auf 200 gesetzt wird (wie beim HTTP-Status 200 OK) (das ist einfacher als der etwas komplexere reguläre Ausdruck oben). Beispiel:

    # Remove ".php" extension on "direct" (not rewritten) requests only
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule (.+)\.php$ /$1 [R=301,L,NC]
    

Sie sollten den Code innerhalb des Abschnitts jedoch nicht bearbeiten # BEGIN WordPress, da WordPress selbst versucht, diesen beizubehalten und diesen Code später möglicherweise überschreibt. Diese Regel muss entfernt werdenVorder # BEGIN WordPressKommentarmarker. Sie müssen die RewriteEngine OnAnweisung, die später in der Datei (im WordPress-Abschnitt) erscheint, nicht wiederholen.

Sie müssen vor dem Testen den Cache Ihres Browsers leeren, da die fehlerhafte (permanente) Weiterleitung wahrscheinlich vom Browser zwischengespeichert wurde. Testen Sie zunächst mit 301-Weiterleitungen (temporär), um Cache-Probleme zu vermeiden.

Dies allein reicht jedoch nicht aus, um auf .phpDateien ohne die .phpErweiterung zuzugreifen. Denn die URL ohne Erweiterung muss intern wieder in die .phpDatei zurückgeschrieben werden.

verwandte Informationen