Apache удаляет пустой сегмент пути. Таким образом, /path//
рассматривается как /path/
. Но ваш браузер не разрешает относительные URL с помощью /path//
.
Если вы хотите удалить несколько слэшей, вы можете использовать следующее правило:
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /(([^/\ ]+/)*)/+([^\ ]*)
RewriteRule ^ /%1%3 [L,R=301]
Explaination
Несмотря на то, что Apache удаляет внутренние пустые сегменты пути, переменная окружения THE_REQUEST
(содержащая строку HTTP-запроса ) остается без изменений. Таким образом, мы можем использовать это значение для проверки нескольких слэшей.
^[A-Z]+\ /
соответствует методу запроса, следующему пробелу и первому символу косой черты пути URI.
(([^/\ ]+/)*)
соответствует всем следующим непустым сегментам пути (foo/
, foo/bar/
, foo/bar/baz/
и т. Д.) Или ничего, если таковых нет.
/+
соответствует пустым сегментам пути, так как символ перед этой косой чертой всегда является другой косой чертой (см. Выражения до).
([^\ ]*)
соответствует остальному URI (который может содержать дополнительные пустые сегменты пути).
Пример: Допустим, мы запрашиваем http://example.com/foo/bar//baz
, строка запроса будет выглядеть следующим образом:
GET /foo/bar//baz HTTP/1.1
Шаблон будет соответствовать следующему:
0: GET /foo/bar//baz
1: foo/bar/
2: bar/
3: baz
Таким образом, запрашиваемый путь /foo/bar//baz
будет перенаправлен на /foo/bar/baz
(/%1%3
).