Apache переписать правило косой черты - PullRequest
6 голосов
/ 23 декабря 2010

Первый аргумент с косой чертой: игнорируется?

Какая разница в синтаксисе между

RewriteRule help help.php?q=noslash [L]     #1
RewriteRule /help help.php?q=withslash [L]  #2

Если я нажму http://localhost/help,, он перейдет к # 1, если я нажму http://localhost//help, он все равно перейдет к # 1.

Прав ли я, говоря, что косая черта в первом аргументе RewriteRule по существу игнорируется?

Второй аргумент, начинающийся с косой черты: ошибка?

Кроме того, почему не работает это правило перезаписи?

RewriteRule help /help.php [L]     #1

Помещение косой черты перед вторым аргументом фактически создает ошибку 500 для сервера. Почему?

Должен заметить, что я использую файл .htaccess для написания этих правил в

Ответы [ 5 ]

12 голосов
/ 23 декабря 2010

Как ни странно,

RewriteRule   ^/help    help.php?q=2              [L]

Приведенное выше правило не выполняется и никогда не совпадает.

Это правило:

RewriteRule   ^help      help.php?q=1             [L]

Соответствует http://localhost/help, http://localhost//help и http://localhost///help

Похоже, RewriteRule никогда не видит начальные косые черты пути, и, как сказал Кулол , они свернуты (до 0, когдаиспользуя файл .htaccess в любом случае) независимо от того, сколько их.

Для второй части вопроса,

RewriteRule   ^help    /help.php

Я получаю ответ от Полное руководство поApache Mod_rewrite

... цель перезаписи, которая не начинается с http: // или другого обозначения протокола, предполагается, что путь к файловой системе.Пути к файлам, которые не начинаются с косой черты, интерпретируются как относящиеся к каталогу, в котором происходит перезапись.

Таким образом, /help.php ищет в корне системы файл help.php, который в моей системе не может быть найден.

Чтобы /help.php отображался как относительныйURL (относительно корня сайта) вы можете использовать директиву [PT]:

RewriteRule   ^/help    /help.php    [PT]

, которая направляет http://localhost/help на http://localhost/help.php.

4 голосов
/ 23 декабря 2010

Относительно двойной косой черты: большинство веб-серверов молча объединяют несколько косых черт в одну косую черту в начале конвейера обработки запросов.Это верно по крайней мере для Apache, Tomcat и Jetty.Большинство файловых систем на основе Unix работают одинаково.Если вы действительно хотите проверить это, вам нужно сделать что-то вроде:

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ 
1 голос
/ 12 апреля 2016

help соответствует «help» в любом месте пути.

/help ничего не соответствует, так как директива rewriterule опускает косую черту в начале для сопоставления (т. Е. Вы должны использовать ^, а не/ или ^/, для ссылки на текущий каталог).

(Это может быть очень запутанным, если вы использовали %{REQUEST_URI} в rewritecond, потому что %{REQUEST_URI} делает начинаются с завершающей косой черты. При сопоставлении с %{REQUEST_URI}, ^ и ^/ эквивалентны, а имени каталога всегда будет предшествовать символ косой черты, независимо от того, находится он в каталоге верхнего уровня.)

Ошибка сервера вызвана бесконечным циклом.«help» становится «/help.php», что соответствует той же директиве, что и при переписывании.Итак, после первого совпадения «/help.php» становится «/help.php» бесконечно, что приводит к URL, который не может быть разрешен.

Я считаю, что такие циклы можно исправить с помощью endфлаг (т. е. [end]), но этот флаг требует Apache 2.3.9+, тогда как Apache 2.2 кажется более распространенным в развертывании.Возможно, в любом случае было бы лучше просто исправить регулярное выражение;^help$ может показаться лучшим выбором.

0 голосов
/ 08 января 2011

Причиной ошибки 500 является бесконечный цикл:

  • справка переписана в / help
  • / help лишается помощи
  • help переписывается в / help и т.д., пока не будет достигнут предел MaxRewrites -> 500

Принимая во внимание, что если правило переписывает справку, Apache достаточно умен, чтобы прервать переписывание в этот момент.

0 голосов
/ 23 декабря 2010

Способ работы RewriteRule заключается в том, что если данное регулярное выражение соответствует какой-либо части пути пути URL (части после хоста и порта, но перед строкой запроса), тогда вся часть пути полностью заменяется заданнойзамена.Это объясняет поведение, которое вы видите в первой части вашего вопроса.

Я не уверен, что может быть причиной 500 ошибок во второй части;может быть, после запуска механизма перезаписи не произойдет свертывания двойных слешей, а затем произойдет ошибка сервера.

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