.htaccess Переписать, чтобы заставить Trailing Slash в конце - PullRequest
32 голосов
/ 16 октября 2011

В моем файле 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 ]

67 голосов
/ 23 марта 2012

Несколько более надежный ответ, основанный на ответ выше :

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

RewriteCond проверит, чтобы убедиться, что нет файлов с таким именем, и если нет, выполните RewriteRule. Более перспективно, чем иметь список ручных расширений!

30 голосов
/ 16 октября 2011
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]
5 голосов
/ 13 июня 2012

Пока Решение Смерти работает, это может раздражать, если вы забыли добавить определенные типы файлов в список. Вы можете сделать это, чтобы принудительно использовать косую черту для всех URL-адресов, которые не указывают непосредственно на файл, используя !-f в условии.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ http://%{HTTP_HOST}/$1/ [L,R=301]
2 голосов
/ 21 мая 2014

Принятый ответ не сработал для меня.Это действительно так: 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 / для каждого правила.По крайней мере, когда я его убрал, он перестал работать.

0 голосов
/ 29 июня 2016

Для принудительного использования косой черты вы можете использовать:

RewriteEngine on

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

Примечание * Модуль mod-dir, который запускается до того, как mod-rewrite автоматически добавляет завершающую косую черту, когда видит запрос на existant dir, поэтому мы должны исключить каталоги из правила, в противном случае, используя правило без RewriteCond %{REQUEST_FILENAME} !-d в некоторых сервера, вы в конечном итоге на /dir// или это может вызвать проблемы, если вы выключили директорию слэш.

Приведенное выше правило добавляет косую черту ко всем запросам, включая файлы с расширением. Если вы не хотите, чтобы ваши файлы имели косую черту, вы можете исключить их, добавив следующее правило над правилом

RewriteCond %{REQUEST_FILENAME} !-f
0 голосов
/ 16 июня 2016
<rule name="Remove trailing slash" stopProcessing="true">
    <match url="^([^.]+)/$" />

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

0 голосов
/ 09 мая 2016

Приведенные выше примеры не сработали для меня из-за принудительной косой черты в конце правила, например, $ 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`
0 голосов
/ 23 декабря 2014

Это прекрасно работает для меня и не зависит от оценки фактического файла, так как некоторые предлагают флаг '-f':

RewriteCond %{REQUEST_URI} !\.[a-z0-9]+$ [NC]
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301]
0 голосов
/ 16 июня 2014

Это прекрасно работает для меня. (из комментария пользователя 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> 
0 голосов
/ 16 октября 2011
RewriteRule ^(.*)[^/]$ $1/ [L,R=301]

Это должно работать очень хорошо. Он просто проверяет, чтобы конечный символ не был косой чертой, и добавляет его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...