Директива местоположения Apache - отрицательные комбинации PCRE (соответствуют всем, кроме..)
Да, я все еще использую 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
1 ответ
Apache Docs говорит, что 2.2 использует PCRE.
Исходя из этого вопроса о stackoverflow, регулярное выражение lookahead должно быть примерно таким (обратите внимание на дополнительные отступы в .\.js
чтобы было 4 символа)
<Location ~ "^.*(?!\.jpg|\.png|\.bmp|\.gif|\.css|.\.js|\.svg)....$">
Это приведет к .*
чтобы впитать все, кроме последних 4 символов, затем проверьте, не соответствуют ли следующие четыре символа какому-либо из расширений, а затем завершите строку.
Проблема в том, что если файл или путь короче 4 символов (/me
) это тоже не будет соответствовать. Вместо этого вы можете использовать отрицательное совпадение:
<Location ~ "^.*$(?<!\.jpg|\.png|\.bmp|\.gif|\.css|\.js|\.svg)">
Это должно впитать всю строку в .*
(Был аргумент, $
следует перейти до или после просмотра), затем выполнить резервное копирование и посмотреть, не закончилось ли оно одним из расширений, и не может соответствовать, если это так.