.htaccess Rewrite to Force Trailing Slash в конце
В моем файле htaccess есть следующий код:
# Force Trailing Slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^[^/]+$ %{REQUEST_URI}/ [L,R=301]
Кажется, что все нормально, когда я перехожу на www.mydomain.com/test, он перенаправляет его на /test/. Проблема в том, что когда я перехожу к www.mydomain.com/test/another, она не помещает конечную косую черту на другую.
Кто-нибудь знает, как изменить мой код, чтобы сделать трейлинг-косую работу независимо от того, как долго URL-адрес?
Спасибо!
Ответы
Ответ 1
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301]
Изменить: в случае, если вы хотите исключить некоторые запросы, например, для файлов php:
RewriteCond %{REQUEST_URI} !\.(php|html?|jpg|gif)$
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301]
Ответ 2
Несколько более надежный ответ, основанный на ответе выше:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)([^/])$ /$1$2/ [L,R=301]
RewriteCond
будет проверять, нет ли файлов с этим именем, а если нет, выполните RewriteRule. Более надежный, чем ручной список расширений!
Ответ 3
В то время как Death solution работает, это может раздражать, когда вы забыли добавить определенные типы файлов в список. Вы можете сделать это, чтобы заставить трейлинг-косую черту для всех URL-адресов, которые не указывают непосредственно на файл, используя !-f
в условии.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ http://%{HTTP_HOST}/$1/ [L,R=301]
Ответ 4
Принятый ответ не помог мне. Это произошло от 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]
Обратите внимание на RewriteBase /
для каждого правила. По крайней мере, когда я удалил его, он перестал работать.
Ответ 5
RewriteRule ^(.*)[^/]$ $1/ [L,R=301]
Это должно работать очень хорошо. Он просто проверяет, чтобы конечный символ не был косой чертой и добавил один.
Ответ 6
Это отлично работает для меня. (из комментария пользователя Ajax)
Проблема с другими ссылками заключалась в том, что мой CSS перестали работать после применения правила перенаправления, но CSS также отлично работает с приведенным ниже правилом перезаписи
RewriteRule ^((.*)[^/])$ $1/ [L,R=301]
Полный код
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
#Force Trailing slash
RewriteRule ^((.*)[^/])$ $1/ [L,R=301]
</IfModule>
Ответ 7
Это работает отлично для меня и не полагается на оценку фактического файла, поскольку некоторые предложили флаг -f:
RewriteCond %{REQUEST_URI} !\.[a-z0-9]+$ [NC]
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301]
Ответ 8
Вышеприведенные примеры не помогли мне благодаря принудительной косой черте в конце правила, например. $1 $2/.
Для меня это работало (я использовал его для wordpress и перенаправлял HTTPS). Вы должны добавить условие и строки правил непосредственно за линиями RewriteEngine и RewriteBase:
# 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`
Ответ 9
Чтобы заставить конечную косую черту, вы можете использовать:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R]
Примечание mod-dir
модуль, который выполняется до mod-rewrite
, автоматически добавляет конечную косую черту, когда видит запрос для existant dir
, поэтому мы должны исключать каталоги из правила, иначе используя правило без RewriteCond %{REQUEST_FILENAME} !-d
на некоторых серверах, вы попадете в /dir//
, или это может вызвать проблемы, если вы отключили directorySlash.
Приведенное выше правило добавляет конечную косую черту ко всем запросам, включая файлы с расширением, если вы не хотите, чтобы ваши файлы с завершающим косой чертой, вы можете исключить их, добавив следующее условие выше правила
RewriteCond %{REQUEST_FILENAME} !-f
Ответ 10
<rule name="Remove trailing slash" stopProcessing="true">
<match url="^([^.]+)/$" />
добавьте это правило в свой файл конфигурации, и он работает для меня