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!
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]
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!
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]
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.
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.
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`
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>
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
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]