Mod_rewrite: удалить завершающий слэш (только один!)
Я использую mod_rewrite/.htaccess для довольно URL-адресов.
Я использую это условие/правило для исключения конечных косых черт (вернее: переписываю URL-адрес без привязки к косую черту с помощью перенаправления 301, я делаю это, чтобы избежать дублирования контента и потому, что мне нравятся URL-адреса с никаких косых черт лучше):
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} !^\.localhost$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
Хорошо работает до сих пор. Только недостаток:
он также перенаправляет "множественные трейлинг-косые черты" -URLs на URL без привязки к косой чертой.
Пример:
http://example.tld/foo/bar//////
вперед до http://example.tld/foo/bar
в то время как я хочу, чтобы http://example.tld/foo/bar/
перешел на http://example.tld/foo/bar
.
Итак, возможно ли исключить только следы слэшей, если на самом деле это всего лишь одна конечная косая черта?
Извините, если это несколько раздражающий или странный вопрос!
Спасибо.
Ответы
Ответ 1
следующее правило будет соответствовать любому URL-адресу, заканчивающемуся косой чертой, и удалять все косые черты с конца:
RewriteRule ^(.*)/+$ $1 [R=301,L]
Примечание: принятый в настоящее время ответ работает только для http не https, но этот работает для обоих.
Ответ 2
измените правило перезаписи на:
RewriteRule ^(.+[^/])/$ http://%{HTTP_HOST}/$1 [R=301,L]
на английском языке: совпадение с началом строки, одним или несколькими вещами, НЕ косой чертой, косой чертой, концом.
Ответ 3
^(.+[^/])/$
т.е. передний символ не должен быть косой чертой.
Ответ 4
Вот решение на основе mod-alias для удаления конечной косой черты из URL-адресов:
RedirectMatch ^/(.*?)/$ /$1
Вы можете использовать вышеуказанную переадресацию в файле htaccess или server.config.
Это перенаправит /uri/ в */uri **.
Ответ 5
Если вы хотите удалить только косые черты из запросов GET, используйте следующее:
RewriteCond %{REQUEST_METHOD} =GET
RewriteRule ^(.*)/$ /$1 [L,R=301]