是的,我仍然在系统上使用 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)">
这应该吸收整个字符串.*
(有一个争论是否$
应该在后视之前或之后进行),然后返回并查看它是否以其中一个扩展结束,如果是则匹配失败。