Директива местоположения 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)">

Это должно впитать всю строку в .* (Был аргумент, $ следует перейти до или после просмотра), затем выполнить резервное копирование и посмотреть, не закончилось ли оно одним из расширений, и не может соответствовать, если это так.

Другие вопросы по тегам