.htaccess Redirect 301 mit abschließendem Schrägstrich fügt dem Ziel einen abschließenden Schrägstrich hinzu

Oct 11 2020

Habe gerade meine Website neu erstellt und versuche, Weiterleitungen in der .htaccess-Datei für geänderte Links einzurichten

Dies funktioniert gut, außer es funktioniert nicht für /example/(mit einem abschließenden Schrägstrich im Quellpfad)

Redirect 301 /example /example.php

Also habe ich dies hinzugefügt, um den abschließenden Schrägstrich zu berücksichtigen:

Redirect 301 /example/ /example.php

Dies leitet jedoch weiter zu example.php/(fügt dem Ziel einen abschließenden Schrägstrich hinzu, der nicht funktioniert).

Klar mache ich das falsch. Was ist ein besserer Weg?

Antworten

4 MrWhite Oct 12 2020 at 01:21

Aber das leitet weiter zu example.php/

Dies wird durch die erste (ursprüngliche) Regel verursacht. Beachten Sie, dass der frühere (fehlerhafte) 301 wahrscheinlich vom Browser zwischengespeichert wurde. Testen Sie mit 302 (temporären) Weiterleitungen, um mögliche Caching-Probleme zu vermeiden.

Die RedirectDirektive ist Präfix-Matching (ganze Pfadsegmente), und alles nach dem Match wird an das Ende der Ziel-URL angehängt. Die erste Richtlinie leitet also weiter:

  • /example zu /example.php
  • /example/zu /example.php/und
  • /example/abc zu /example.php/abc

Wenn die Anweisungen so angeordnet sind, sollten sie für die beiden veröffentlichten Beispiel-URLs "funktionieren":

Redirect 301 /example/ /example.php
Redirect 301 /example /example.php

Die RedirectDirektive ist jedoch nicht wirklich die richtige Direktive, da Sie zwei Direktiven benötigen, um dies zu handhaben. (Im Allgemeinen müssen Sie bei der RedirectDirektive den abschließenden Schrägstrich sowohl in der Quell- als auch in der Ziel-URL einschließen oder ausschließen .)

Sie können RedirectMatchstattdessen die Direktive verwenden, die mit einem regulären Ausdruck übereinstimmt. Zum Beispiel, um sowohl mit als auch ohne nachgestellten Schrägstrich umzugehen:

RedirectMatch 301 ^/example/?$ /example.php

Dies stimmt nur mit /exampleoder überein /example/und leitet weiter zu /example.php.

Redirectund RedirectMatchsind beide Teil von mod_alias.

Wenn Sie jedoch bereits mod_rewrite verwenden, sollten Sie RewriteRulestattdessen mod_rewrite verwenden, um mögliche Konflikte zu vermeiden, da mod_rewrite trotz der offensichtlichen Reihenfolge der Anweisungen in immer vor mod_alias ausgeführt wird .htaccess. Zum Beispiel:

RewriteEngine On

RewriteRule ^example/?$ /example.php [R=301,L]

Beachten Sie, dass das RewriteRule Muster bei Verwendung kein Schrägstrichpräfix enthält, .htaccessda für den URL-Pfad, mit dem das Muster übereinstimmt, das Verzeichnispräfix (das immer mit einem Schrägstrich endet ) entfernt wurde.

Beachten Sie auch, dass die Reihenfolge der Anweisungen in jedem Modul wichtig sein kann.

Nebenbei: Wenn Ihre Website "neu erstellt" wurde, warum sind die "neuen" URLs des Formulars /example.php? Dies scheint rückwärts zu sein?


UPDATE: Ich hatte jemanden, der die ursprüngliche WordPress-Website in eine (fast) gleichwertige Website konvertierte, die nur HTML und ein wenig Javascript und PHP verwendete

Sie können möglicherweise die ursprünglichen WordPress-URLs (z. B. /example) beibehalten und die Anforderung intern in die zugrunde liegende Datei umschreiben, die die Anforderung verarbeitet (z. B. example.php), anstatt sie extern umzuleiten . Dazu müssten Sie mod_rewrite verwenden. Sie müssen auch auf die "alten" WordPress-URLs in Ihrer HTML-Quelle verlinken. z.B. /example(und erwägen Sie, den abschließenden Schrägstrich zu kanonisieren - auf den einen oder anderen umzuleiten).

Um intern neu zu schreiben/example (oder /example/), müssen /example.phpSie lediglich das RFlag aus der obigen RewriteRuleAnweisung entfernen . Zum Beispiel:

RewriteRule ^example/?$ example.php [L]

(Ich habe auch das Schrägstrichpräfix bei der RewriteRule Ersetzung entfernt , das jetzt nicht mehr erforderlich ist, da wir in einen Dateisystempfad umschreiben.)

Wenn Sie /examplein Ihrer HTML-Quelle einen Link zu erstellen, weiß der Benutzer nicht, dass die Anforderung wirklich zugeordnet ist example.php.