Почему RewriteRule ^ page /? $ Page.php [L] соответствует site.com/page// - PullRequest
1 голос
/ 24 января 2009
RewriteEngine on
RewriteRule ^page/?$ page.php [L]

В конечном итоге это соответствует URL-адресу www.site.com/page//, но внутри он действует не так, как www.site.com/page/, поскольку таблицы стилей и изображения больше не отображаются правильно. Я делаю что-то не так или мне нужно разобраться с этим, если я не хочу переживать много неприятностей?

Мне кажется, это должно соответствовать только www.site.com/page или www.site.com/page/

1 Ответ

4 голосов
/ 24 января 2009

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...