Подтвердить что ты не робот

.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-адрес?

Спасибо!

4b9b3361

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

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