Неизбежные периоды в Apache 2.0 RewriteRule Regex - PullRequest
0 голосов
/ 16 декабря 2011

Итак, у меня есть следующий RegEx ..

RewriteRule ^([-a-z0-9]*[A-Z\.]+.*)$ file.php?string=$1 [QSA]

URL-адрес, для которого нужно активировать file.php, должен содержать заглавные буквы или точку, а затем отправить URL-адрес сценарию PHP.

Однако проблема, с которой я столкнулся, заключается в том, что этот сценарий запускается на любом URL-адресе из-за не совсем экранированного периода.

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

Что я делаю не так?

Редактировать: Например,

RewriteRule ^([-a-z0-9]*[A-Z\\.]+[-a-z0-9\/]*)$ file.php?string=$1 [QSA]

не работает, но

RewriteRule ^([-a-z0-9]*\\.+[-a-z0-9\/]*)$ file.php?string=$1 [QSA]

избегает его.

Редактировать 2: Примеры URL-адресов, которые я хочу перенаправить:

  • / некоторые-страницы идут-here.html
  • / Херес-Robs / Старый / Страница /

И те, которые я не:

  • / тестирование / один / два /
  • / / фактического file.gif

РЕДАКТИРОВАТЬ 3: Старое регулярное выражение было:

RewriteRule ^([-a-z0-9]*[A-Z\.]+[-a-z0-9\/]*)$ file.php?string=$1 [QSA]

Но во время написания поста я обновил регулярное выражение вопроса до того, что вы видите выше.

Ответы [ 2 ]

1 голос
/ 17 декабря 2011

Я не думаю, что ваша проблема может быть такой, как вы думаете: периоды в классе символов должны означать буквальные периоды, а не "любой символ".Если это действительно является проблемой, то вы можете изменить [A-Z\.]+ на ([A-Z]|\.)+;но я сомневаюсь в этом.Несколько вещей, которые нужно попробовать:

  • что произойдет, если вы закомментируете эту строку?это успешно отключить это перенаправление?если нет, то, очевидно, проблема не в этой строке.: -)
  • что произойдет, если вы сделаете это настоящим HTTP-перенаправлением, изменив QSA на QSA,R?URL назначения выглядит так, как вы ожидаете?Может быть, есть неожиданные периоды или заглавные буквы?(Предупреждение: это очень вероятно вызовет бесконечный цикл перенаправления, если вы попробуете это в браузере; вероятно, будет легче попытаться отправить запрос через Telnet порта-80 и увидеть фактический HTTP-ответ.)

Кроме того, ваше правило не совсем соответствует тому, как вы его описываете.Например, ваше правило не будет совпадать с URL-адресом, таким как a.b.c, потому что вы используете только заглавные буквы и / или точки, которые встречаются в одном «скоплении»;если они разделены строчными буквами, совпадения не будет.Это потому, что вы не хотели переусердствовать в описании?

1 голос
/ 17 декабря 2011

Попробуйте:

RewriteCond %{REQUEST_URI} [A-Z] [OR]
RewriteCond %{REQUEST_URI} \.html$
RewriteRule (.*) file.php?string=$1 [QSA]

Когда вы используете mod_rewrite и у вас есть несколько URL для сравнения, всегда лучше использовать RewriteCond для фильтрации и затем применить RewriteRule.

...