Regex отрицательное предвидение не работает на mod_rewrite между различными версиями Apache

Для OS X это довольно просто: перейдите к http://www.apple.com/support/leopard/, и Вы будете видеть, что в 2009 было 2 обновления системы защиты и было 7 обновлений 10,5, так как это было выпущено. Обратите внимание, что доработанные версии имеют тенденцию включать последние обновления системы защиты поэтому в этом году было, вероятно, только 3 обновления OS X.

Включая Safari iTunes и т.д. обновляет однако, я сказал бы, что обновил свою систему приблизительно 4-5 раз в этом году. Не еженедельная вещь безусловно.

5
задан 28 September 2011 в 08:26
2 ответа

Apache 1.3 не использует Perl совместимый регулярный expressoins (PCRE), он использует POSIX regexes. POSIX regexes не поддерживает отрицательное предвидение. Поддержка PCRE является новой возможностью, запускающейся в Apache 2.

Относительно того, как заставить это работать, вероятно, необходимо использовать некоторый RewriteCond, чтобы иметь правило НЕ, инициировали, если это соответствует одному из тех трех..., например, возможно:

RewriteCond   %{REQUEST_URI}   !index.php.*
RewriteCond   %{REQUEST_URI}   !skin/.*
RewriteCond   %{REQUEST_URI}   !js/.*
RewriteRule   ^(?!index.php)(?!skin/)(?!js/)(.+)  /index.php?file=$1    [NC,L]

Конечно, я не протестировал это... У меня нет Apache 1.3's вокруг больше.

6
ответ дан 3 December 2019 в 01:28
  • 1
    Большое спасибо за объяснение и фиксируют - решенная проблема.:) –  tjbp 10 March 2010 в 13:44

Adam Bellaire прав. Apache изменил механизм регулярного выражения с версией 1.2 и с версией 2.0.

Для Apache 1.1.x они использовали “Систему V8” и начиная с Apache 1.2, и позже это был POSIX ДО. Последнее изменение было с Apache 2.0, когда они переключились на PCRE. Можно смотреть на Сравнение Разновидности Регулярного выражения для наблюдения различий.

Теперь вот решение, как можно решить это без предварительных утверждений, которые только доступны в PCRE:

RewriteCond $1 !^(index\.php|skin/|js/)
RewriteRule ^(.+) /index.php?file=$1 [NC,L]

Здесь дополнительное RewriteCond должен проверить, что совпавшая строка первого подшаблона действительно запускается с перечисленных опций.

1
ответ дан 3 December 2019 в 01:28

Теги

Похожие вопросы