.htaccess, mod_rewrite и дублирующиеся слеши?

Добрый день, для удаления дублирующихся слешей пользуюсь регуляркой вида:
RewriteCond %{REQUEST_URI} ^(.*?)/{2,}(.*?)$ [NC]
RewriteRule . %1/%2 [R=301]


Но возникла проблема, и заключается она в том, что сия регулярка не глобальная каждый блок слешей обрабатывает отдельным проходом, соответственно — отдельным запросом, и в логе получается такая петрушка:
127.0.0.1 - - [17/Jul/2013:12:23:04 +0300] "GET ////WAT////no////u//must/be////kidding/////me// HTTP/1.1" 301 269
127.0.0.1 - - [17/Jul/2013:12:23:04 +0300] "GET /WAT/no////u//must/be////kidding/////me// HTTP/1.1" 301 266
127.0.0.1 - - [17/Jul/2013:12:23:04 +0300] "GET /WAT/no/u//must/be////kidding/////me// HTTP/1.1" 301 265
127.0.0.1 - - [17/Jul/2013:12:23:04 +0300] "GET /WAT/no/u/must/be////kidding/////me// HTTP/1.1" 301 262
127.0.0.1 - - [17/Jul/2013:12:23:04 +0300] "GET /WAT/no/u/must/be/kidding/////me// HTTP/1.1" 301 258
127.0.0.1 - - [17/Jul/2013:12:23:04 +0300] "GET /WAT/no/u/must/be/kidding/me// HTTP/1.1" 301 257
127.0.0.1 - - [17/Jul/2013:12:23:04 +0300] "GET /WAT/no/u/must/be/kidding/me/ HTTP/1.1" 404 226


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

P.S. Дополнительный, бонусный вопрос: Так и не смог средствами Apache заменить дублирующимеся слеши от корня без query. Напримерhttp://test.ru///////не ловится реврайтом, как бы я ни старался. В верхнем случае эти слеши убираются при внутреннем редиректе апача, но не реврайтом, видно это по второй строчке лога, в которой видно, что пропали слеши не только в начале, но и перед «no», что и было сделано mod_rewrite.
  • Вопрос задан
  • 9513 просмотров
Решения вопроса 1
khipster
@khipster
2 года прошло. Ловите решение:
# Редирект на страницу без многократных /.
RewriteCond %{THE_REQUEST} //
RewriteRule .* /$0 [R=301,L]
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
PaulZi
@PaulZi
Вариант без костылей:
RewriteCond %{REQUEST_URI} ^(.*?)/{2,}(.*?/{2,}.*?)$ [NC]
RewriteRule . %1/%2 [L]

RewriteCond %{REQUEST_URI} ^(.*?)/{2,}(.*?)$ [NC]
RewriteRule . %1/%2 [R=301]
Ответ написан
Комментировать
@mayorovp
Я не специалист, но попробуйте что-то вроде вот этого:

RewriteRule ^Simplify/(.*?)/{2,}(.*?) Simplify/%1/%2 [N,C]
RewriteRule ^Simplify/(.*?) %1 [R=301,L]
RewriteRule ^(.*?)/{2,}(.*?) Simplify/%1/%2 [N]
Ответ написан
Комментировать
PaulZi
@PaulZi
Как костыль, могу предложить перенаправлять запросы в которых есть два слэша подряд на скрипт (без флага «R»), который уже подчистит URL и выдаст корректный редирект.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Смотрите у меня в подписи (about)
Ответ написан
Комментировать
@ipboyar
Для потомков:

Решение немного неожиданное

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ [NC]
RewriteRule ^(.*)$ $1 [L,R=301]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы