it-swarm.com.de

rewrite url - entferne eventuelle Trailing / und füge .php hinzu

Ich habe eine einfache Frage, aber ich habe keine Beiträge gefunden, die meine Frage beantworten. Ich benötige eine htaccess-Datei, die die URLs so umschreibt, dass sie die Endung / entfernt und .php hinzufügt, egal in welchem ​​Ordner sie sich befindet. Im Wesentlichen ist dies das, was ich tun möchte:

http://example.com/login/ -> http://example.com/login.php
http://example.com/login -> http://example.com/login.php
http://example.com/user/test/login/ -> http://example.com/user/test/login.php
http://example.com/user/test/login -> http://example.com/user/test/login.php
http://example.com/$1/$2/$3/$4/ -> http://example.com/$1/$2/$3/$4.php
http://example.com/$1/$2/$3/$4 -> http://example.com/$1/$2/$3/$4.php
http://example.com/$1/$2/$3/ ... /$65/ -> http://example.com/$1/$2/$3/ ... /$65.php

Ich möchte, dass die URL umgeschrieben wird, um den abschließenden Schrägstrich zu entfernen, und .php hinzugefügt wird (tun Sie dies jedoch NUR, wenn die Datei vorhanden ist). Und es muss Platzhalter-Unterstützung haben, was bedeutet, dass es für alle Dateien funktioniert, ohne dass der Code für jede einzelne Datei kopiert werden muss. Auf diese Weise sehen die URLs "sauber" aus.

Ich habe viele Posts mit Beispiel-.htaccess -Dateien gefunden, die dem entsprechen, was ich möchte. Aber ich habe keines ohne eines dieser Probleme gefunden:

  1. Es werden keine "Platzhalter" -Umschreibungen verwendet, daher müsste ich den Code für jede Datei kopieren, damit die URL neu geschrieben wird

  2. Wenn vorhanden, wird der abschließende Schrägstrich entfernt, und der Dateiname wird an /index.php?file= angehängt, anstatt die Datei neu zu schreiben.

  3. Das Umschreiben mit 'Platzhalter' funktioniert nur im Stammverzeichnis. Ich kann es nicht verwenden, wenn die Dateien so verschachtelt sind: /$1/$2/$3/$4/.

Ist das möglich? Ich habe noch nie jemanden gesehen, der das getan hat.

Edit: Ich werde ein Kopfgeld gewähren, wenn jemand eine .htaccess -Datei findet, die dies alles korrekt ausführt, aber auch URL-Parameter unterstützt.

5
Aaron Esau

Ich gehe davon aus, dass Sie den abschließenden Schrägstrich (falls vorhanden) mit einer externen Umleitung entfernen möchten, um die URL zu kanonisieren und dann den .php anzufügen. Erweiterung mit einem internen Umschreiben (dh vor dem Benutzer verborgen), um die URL korrekt weiterzuleiten. Dies ist ein zweistufiger Prozess.

Hinweis: Der abschließende Schrägstrich sollte beim Zugriff auf ein physisches Verzeichnis beibehalten werden.

Verwenden von mod_rewrite in .htaccess:

RewriteEngine On

# Remove the trailing slash (if any) for non-directories
# This is essentially unconditional in order to canonicalise the URL
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)/$ /$1 [R=302,L]

# Append ".php" if that file would exist (internal rewrite / hidden from user)
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]

Ändern Sie den R=302 (dh temporäre Umleitung) in R=301, um ihn dauerhaft zu machen. 302s sind einfacher zu testen, da sie nicht vom Browser zwischengespeichert werden. (Stellen Sie vor dem Testen sicher, dass der Browser-Cache leer ist.)

Es ist ein "Platzhalter" in dem Sinne, dass es für jede Dateitiefe funktioniert. .* schnappt sich einfach alles.

URL-Parameter werden standardmäßig an die Ersetzung angehängt - nichts Besonderes, das Sie in dieser Hinsicht tun müssen.


PDATE: Da die kanonische URL die URL zu sein scheint mit dem abschließenden Schrägstrich (an den Anforderungen gesendet werden) ) dann sollte das oben Gesagte wie folgt geändert werden:

RewriteEngine On

# Append .php if that file exists (internal rewrite)
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*?)/?$ $1.php [L]

Dies akzeptiert Anforderungen für /path/to/file und /path/to/file/ und schreibt die Anforderung intern in /path/to/file.php um. Sie müssen die URL-Kanonisierung in Ihrem Skript durchführen. Wenn alle Ihre URLs bereits auf /path/to/file/ verweisen (dh mit einem abschließenden Schrägstrich), können Sie das RewriteRule Muster und entfernen Sie beide ? dh. (.*)/$ - Dies macht den abschließenden Schrägstrich für die Anforderung obligatorisch.

3
MrWhite