Apache 位置指令 - PCRE 否定组合(匹配所有但...)

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 文档说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)">

这应该吸收整个字符串.*(有一个争论是否$应该在后视之前或之后进行),然后返回并查看它是否以其中一个扩展结束,如果是则匹配失败。

相关内容