.htaccess Переписать, чтобы заставить 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?
Спасибо!
10 ответов
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]
Несколько более надежный ответ, основанный на ответе выше:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)([^/])$ /$1$2/ [L,R=301]
RewriteCond
проверит, чтобы убедиться, что нет файлов с таким именем, и если нет, выполните RewriteRule. Более перспективный, чем ручной список расширений!
Хотя решение Death работает, оно может раздражать, если вы забыли добавить определенные типы файлов в список. Вы можете сделать это, чтобы принудительно использовать косую черту для всех URL, которые не указывают непосредственно на файл, используя !-f
в состоянии.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ http://%{HTTP_HOST}/$1/ [L,R=301]
Принятый ответ не работал для меня. Это сделал из 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 /
для каждого правила. По крайней мере, когда я его убрал, он перестал работать.
Это прекрасно работает для меня. (из комментария пользователя 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>
Чтобы принудительно использовать косую черту, вы можете использовать:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R]
Заметка mod-dir
модуль, который работает до mod-rewrite
автоматически добавляет косую черту, когда видит запрос на existant dir
Таким образом, мы должны исключить каталоги из правила, в противном случае, используя правило без RewriteCond %{REQUEST_FILENAME} !-d
на некоторых серверах вы в конечном итоге /dir//
или это может вызвать проблемы, если вы выключили директорию Slash.
Приведенное выше правило добавляет косую черту ко всем запросам, включая файлы с расширением. Если вы не хотите, чтобы ваши файлы с косой чертой, вы можете исключить их, добавив следующее правило над правилом
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)[^/]$ $1/ [L,R=301]
Это должно работать очень хорошо. Он просто проверяет, чтобы конечный символ не был косой чертой, и добавляет его.
Это прекрасно работает для меня и не зависит от оценки фактического файла, так как некоторые предлагают флаг '-f':
RewriteCond %{REQUEST_URI} !\.[a-z0-9]+$ [NC]
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301]
Приведенные выше примеры не сработали для меня из-за принудительной косой черты в конце правила, например, $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`
<rule name="Remove trailing slash" stopProcessing="true">
<match url="^([^.]+)/$" />
добавьте это правило в ваш конфигурационный файл, и оно работает для меня