.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="^([^.]+)/$" />

добавьте это правило в ваш конфигурационный файл, и оно работает для меня

Другие вопросы по тегам