Да, я все еще использую apache2.2 в системе, и я пытаюсь использовать PCRE с директивой apache Location, ищущей любой URL-адрес, не содержащий изображений или чего-либо подобного. Вот некоторые вещи, которые я пробовал, и, похоже, это не дает отрицательного условного соответствия.
<Location "^/(?!(?:jpe?g|png|bmp|gif|css|js|svg))(.*)">
или
<Location ~ "^.*\.(?!jpg$|png$|bmp$|gif$|css$|js$|svg$)[^.]+$">
Возможно ли такое вообще, или apache ограничен этим?
Если мое описание не слишком ясное, вот несколько примеров ...;)
я бы хотел сопоставить что-нибудь подобное:
http://some.site.org/something/
https://some.site.org/else/
http://some.site.org
https://some.site.org/else/and/so/on
http://some.site.org/even/something/even/crazy_url/../../././?/
Но не соответствует что-нибудь вроде:
http://some.site.org/content/monkey.jpg
http://some.site.org/other/chimp.gif
https://some.site.org/phobia/snake.png
http://some.site.org/junk/style.min.css?v=6.1
https://some.site.org/stuff/juju.js?ver=0.4.1
Документы Apache говорят 2.2 использует PCRE.
Из этот вопрос о stackoverflow прогнозирующее регулярное выражение должно выглядеть примерно так (обратите внимание на дополнительные отступы в .\.js
чтобы было 4 символа)
<Location ~ "^.*(?!\.jpg|\.png|\.bmp|\.gif|\.css|.\.js|\.svg)....$">
Это вызовет .*
чтобы впитать все, кроме последних 4 символов, затем проверить, не совпадают ли следующие четыре символа ни с одним из расширений, а затем завершить строку.
Проблема заключается в том, что файл или путь короче 4 символов (/me
) это тоже не совпадет. Вместо этого вы можете попробовать отрицательное ретроспективное сопоставление:
<Location ~ "^.*$(?<!\.jpg|\.png|\.bmp|\.gif|\.css|\.js|\.svg)">
Это должно впитать всю струну в .*
(Был спор о том, $
должен идти до или после ретроспективного просмотра), затем выполните резервное копирование и посмотрите, закончился ли он одним из расширений и не соответствует ли это.