Entfernen von .php aus example.com/.php

Entfernen von .php aus example.com/.php

Um nur .php aus meinen URLs zu entfernen, habe ich derzeit Folgendes

# Remove trailing slashes
RewriteRule ^(.*)\/$ $1 [NC,L,R=301] 

# Remove trailing .php extensions
RewriteCond %{THE_REQUEST} (\S*?)/(.*?)\.php [NC]
RewriteRule ^ %1/%2 [L,R=301]

# Add .php extension for final internal redirect
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteRule !\.php$ %1.php [NC,L]

Diese Regeln funktionieren jedoch nicht für bare, example.comda es als endet example.com/.php. Wie kann ich das also beheben?

Antwort1

Sie müssen entweder:

  • Überprüfen Sie, ob die Zieldatei (mit der .phpErweiterung) existiertVorintern umschreiben
  • Vermeiden Sie das Neuschreiben von Verzeichnissen (bei denen es sich um das Dokumentstammverzeichnis handelt).
  • Vermeiden Sie es, nur das Dokumentstammverzeichnis neu zu schreiben (wie in Ihrem Beispiel).

Um beispielsweise zu vermeiden, dass nur das Dokumentstammverzeichnis neu geschrieben werden muss, wie in Ihrem speziellen Beispiel, können Sie die vorhandene RewriteCondDirektive ändern:

# Add .php extension for final internal redirect
RewriteCond %{REQUEST_URI} ^(.*)$

lesen:

RewriteCond %{REQUEST_URI} ^(/.+)$

/.+entspricht einem Schrägstrich gefolgt vonetwas, was das Dokumentstammverzeichnis ausschließen würde, da das Dokumentstammverzeichnis selbst natürlich ein Schrägstrich ist.


Um das Umschreiben aller Verzeichnisse (zu denen auch das Dokumentstammverzeichnis gehört) zu vermeiden, können Sie eine zusätzliche Bedingung hinzufügen, um das Umschreiben von URLs zu vermeiden, die auf ein physisches Verzeichnis verweisen. Beispiel:

RewriteCond %{REQUEST_URI} ^(/.+)$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.php$ %1.php [NC,L]

Wenn Sie jedoch über Verzeichnisse verfügen, auf die zugegriffen werden kann, sollten Sie Ihre vorhandene Regel ändern und abschließende Schrägstriche entfernen. Andernfalls erhalten Sie wahrscheinlich eine Umleitungsschleife, wenn Sie ein Verzeichnis anfordern (da mod_dir standardmäßig einen Schrägstrich anfügt). Beispiel:

# Remove trailing slashes
RewriteRule ^(.*)\/$ $1 [NC,L,R=301]

Sollte so geändert werden, dass sie die gleiche Bedingung wie oben enthält:

# Remove trailing slashes, unless the request maps to a directory
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [L,R=301]

Außerdem ist die Flagge hier nicht erforderlich NC. Und es besteht keine Notwendigkeit, den Schrägstrich in derRewriteRule Muster.

Ich gehe davon aus, dass Sie auch an anderer Stelle in Ihrer Datei eine Anweisung definiert haben müssen RewriteBase, da dies sonst wahrscheinlich zu einer ungültigen Weiterleitung führt .htaccess.

verwandte Informationen