удаление нескольких групп косых черт везде в URL-адресе в .htaccess

В настоящее время у меня есть веб-сайт, на котором гости могут получить доступ к каждому URL-адресу с любым количеством косых черт для разделения имен папок. Например, если URL-адрес должен быть:

http://example.com/one/two/three/four

Затем пользователи могли получить доступ к той же странице любым из следующих способов:

http://example.com/one//two///three////four/////
http://example.com/one/two////three/four/////
http://example.com///one///////////two////three/four/
http://example.com///////////one///////////two/three/four

Однако я хочу, чтобы приведенные выше примеры URL-адресов перенаправляли пользователей только на этот URL-адрес:

http://example.com/one/two/three/four

Это мой файл .htaccess, чтобы попытаться остановить огромные косые черты:

RewriteCond %{ENV:REDIRECT_STATUS} !^$
RewriteRule .* - [L]
RewriteRule ^(.*)/+$ /$1 [R=301,L,NC]
RewriteCond %{REQUEST_URI} ^/+(.*)/+$
RewriteRule .* /%1 [R=301,L]

Третья строка успешно останавливает косые черты в конце длинных URL-адресов. 4-я и 5-я строки — это моя попытка убрать косые черты сразу после доменного имени, но безуспешно.

Причина, по которой я задаю этот вопрос, заключается в том, что я не хочу, чтобы Google ловил меня на дублирующемся контенте, а при активном AdSense на сайте Google, скорее всего, просканирует все URL-адреса, к которым я обращаюсь.

Есть ли комбинация RewriteCond/RewriteRule, которую я могу использовать для удаления средней косой черты, или это более сложно?


person Mike -- No longer here    schedule 11.08.2015    source источник


Ответы (2)


Вы можете использовать это правило для удаления нескольких косых черт в любом месте URL, кроме строки запроса:

RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule ^.*$ /$0 [R=302,L,NE]
person anubhava    schedule 11.08.2015
comment
например https://localhost///////////one///////////two//////////three/four/////// станет https://localhost/one/two/three/four/ за одно перенаправление. - person anubhava; 11.08.2015
comment
Определенно работает, @Mike, ты должен принять этот ответ. Спасибо Анубхава. - person DeDee; 15.11.2015
comment
Он будет работать с любым количеством косых черт более одного - person anubhava; 31.01.2020
comment
Это недокументированное поведение? Поскольку в документации HTTP-сервера Apache указано: $0 provides access to the whole string matched by that pattern. не упоминается, что он автоматически сжимает все // в один /. - person Maris B.; 20.11.2020
comment
@МарисБ. Не всегда легко найти документацию по всем функциям. Документация разбросана по разным местам, но это установленный факт, что несколько // преобразуются в одиночные / по образцу RewriteRule. - person anubhava; 20.11.2020
comment
@МарисБ. Это не сама обратная ссылка $0, которая уменьшает количество косых черт. Как вы утверждаете, $0 просто содержит всю строку, соответствующую шаблону. В контексте каталога (или .htaccess) RewriteRule шаблон соответствует URL-пути после его сопоставления с файловой системой. Это процесс сопоставления запроса с файловой системой, который уменьшает количество косых черт. И наоборот, та же директива не работает, если используется в контексте сервера или виртуального хоста, который обрабатывается до запроса, сопоставленного с файловой системой ( когда несколько косых черт не были уменьшены). - person MrWhite; 07.12.2020
comment
@anubhava, не могли бы вы объяснить, почему 302, а не 301? Кто хотел бы удалить косые черты только временно? - person Andrei; 20.01.2021
comment
302 предназначен только для тестирования, поэтому вам не нужно очищать кеш браузера во время тестирования. После проверки он должен быть только 301. - person anubhava; 21.01.2021

Это работает для меня:

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
person weblegko    schedule 01.09.2017