
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
:
- Sie werden umgeleitet
/somepage
(gemäß der ersten Regel). Die Umleitungsantwort wird an den Client zurückgesendet. - Bei der zweiten Anforderung
/somepage
wird intern nach/index.php
der letzten Regel umgeschrieben. Die Umschreibe-Engine startet dann von vorne (in einemVerzeichnisKontext)... /index.php
umgeleitet wird/index
(gemäß der ersten Regel). Die Umleitungsantwort wird an den Client zurückgesendet.- Bei der dritten Anforderung wird intern durch das letzte Umschreiben
/index
umgeschrieben . Die Umschreib-Engine beginnt dann von vorne.../index.php
- 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 END
Flag bei Apache 2.4 oder es erfolgt eine externe 3xx-Umleitung.)
Die Änderung in "entfernen" .html
funktioniert einwandfrei, da Sie in umschreiben /index.php
, das nicht mit endet . Daher stimmt .html
die 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
END
Flags (Apache 2.4+) beim letzten Umschreiben, anstattL
weitere 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
.php
Erweiterung anhandTHE_REQUEST
der 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_STATUS
Umgebungsvariable, 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 WordPress
Kommentarmarker. Sie müssen die RewriteEngine On
Anweisung, 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 .php
Dateien ohne die .php
Erweiterung zuzugreifen. Denn die URL ohne Erweiterung muss intern wieder in die .php
Datei zurückgeschrieben werden.