it-swarm.com.de

.htaccess Rewrite zum Erzwingen des ablaufenden Schrägstrichs am Ende

Ich habe den folgenden Code in meiner Htaccess-Datei:

# Force Trailing Slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^[^/]+$ %{REQUEST_URI}/ [L,R=301]

Das scheint gut zu funktionieren, wenn ich zu www.mydomain.com/test gehe und es nach/test/umleitet. Das Problem ist, wenn ich zu www.mydomain.com/test/another gehe, wird der nachfolgende Schrägstrich nicht auf einen anderen gesetzt.

Weiß jemand, wie ich meinen Code so ändern kann, dass der nachstehende Schrägstrich funktioniert, egal wie lang die URL ist?

Vielen Dank!

31
Drew
RewriteRule ^(.*)([^/])$ http://%{HTTP_Host}/$1$2/ [L,R=301]

Edit : Wenn Sie einige Anforderungen wie PHP-Dateien ausschließen möchten:

RewriteCond %{REQUEST_URI}  !\.(php|html?|jpg|gif)$
RewriteRule ^(.*)([^/])$ http://%{HTTP_Host}/$1$2/ [L,R=301]
30
undone

Eine etwas robustere Antwort, basierend auf der Antwort oben :

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)([^/])$        /$1$2/ [L,R=301]

Die Variable RewriteCond überprüft, ob keine Dateien mit diesem Namen vorhanden sind. Falls nicht, führen Sie die RewriteRule aus. Zukunftssicherer als eine manuelle Erweiterungsliste!

67
jeffbyrnes

Während Deaths Lösung funktioniert, kann es ärgerlich sein, wenn Sie vergessen, bestimmte Dateitypen zur Liste hinzuzufügen. Sie können so den nachstehenden Schrägstrich für alle URLs erzwingen, die nicht direkt auf eine Datei verweisen, indem Sie !-f in der Bedingung verwenden.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ http://%{HTTP_Host}/$1/ [L,R=301]
5
Henry Heikkinen

Die akzeptierte Antwort hat bei mir nicht funktioniert. Dies tat von SEOMoz :

# Ensure all URLs have a trailing slash.
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.example.com/$1/ [L,R=301]

Beachten Sie den RewriteBase / für jede Regel. Zumindest als ich es entfernte, funktionierte es nicht mehr.

2
RewriteRule ^(.*)[^/]$ $1/ [L,R=301]

Das sollte ziemlich gut funktionieren. Es wird nur geprüft, ob der nachfolgende Buchstabe kein Schrägstrich ist, und fügt einen hinzu.

0
Dan Ambrisco

Obige Beispiele funktionierten für mich nicht, da am Ende der Regel ein erzwungener Schrägstrich verwendet wurde, z. $ 1 $ 2 /.

Für mich arbeitete das (ich habe es für WordPress und das Umleiten auf HTTPS verwendet). Sie müssen die Bedingungs- und Regelzeilen direkt hinter den Zeilen RewriteEngine und RewriteBase hinzufügen:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# I added these two lines for redirect to HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress`
0
David Najman

Das funktioniert perfekt für mich. (vom Kommentar des Benutzers Ajax) 
Das Problem mit anderen Links war, dass mein CSS nicht mehr funktionierte, nachdem die Umleitungsregel angewendet wurde

RewriteRule ^((.*)[^/])$ $1/ [L,R=301]

Code vervollständigen

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !(.*)/$
    #Force Trailing slash
    RewriteRule ^((.*)[^/])$ $1/ [L,R=301]
</IfModule> 
0
Abhishek Goel

Um den nachfolgenden Schrägstrich zu erzwingen, können Sie Folgendes verwenden:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R]

Hinweis Das mod-dir-Modul, das vor dem mod-rewrite ausgeführt wird, fügt automatisch einen abschließenden Schrägstrich hinzu, wenn eine Anforderung für einen existant dir angezeigt wird. Daher müssen wir Verzeichnisse von der Regel ausschließen. Andernfalls, wenn Sie die Regel ohne RewriteCond %{REQUEST_FILENAME} !-d auf einigen Servern verwenden, landen Sie bei /dir// oder können dies Probleme verursachen, wenn Sie das Verzeichnis Slash deaktiviert haben.

Die obige Regel fügt allen Anforderungen, einschließlich Dateien mit der Erweiterung, einen nachstehenden Schrägstrich hinzu. Wenn Sie nicht möchten, dass Ihre Dateien einen nachgestellten Schrägstrich haben, können Sie sie ausschließen, indem Sie die folgende Bedingung oberhalb der Regel hinzufügen

RewriteCond %{REQUEST_FILENAME} !-f
0
starkeen

Dies funktioniert gut für mich und ist nicht darauf angewiesen, eine tatsächliche Datei auszuwerten.

RewriteCond %{REQUEST_URI} !\.[a-z0-9]+$ [NC]
RewriteRule ^(.*)([^/])$ http://%{HTTP_Host}/$1$2/ [L,R=301]
0
Erutan409