我想要一个nginx位置指令,它将所有网址与“xyz”匹配,但不匹配“.php”
我试过这个
location ~* /(.*)xyz/(.*)(?!\.php)(.*)$ {}
但是例如它似乎总是匹配/ xyz / 1和/xyz/1.php但它应该只匹配/ xyz / 1
答案 0 :(得分:2)
您应该更具体地说明该位置的开头和结尾。如果.php
不应出现在该位置的末尾,请将$
放入预见断言中:
location ~* /(.*)xyz/(.*)(?!.*\.php$)(.*)$ {}
如果xyz
应该是正确的路径段和第一个路径段(因此它必须以/xyz/
开头),请使用:
location ~* ^/xyz/(?!.*\.php$)(.*)$ {}
答案 1 :(得分:1)
如果没有单独的正则表达式检查以确保“.php”不存在,我认为你不能这样做。问题是像.*
这样的结构会吞噬足够多的字符,以确保你的负向前瞻永远不会适用。
答案 2 :(得分:1)
嗯,正如迈克尔所说的那样。*? (注意'?')会使搜索变得非贪婪,并且可以正常工作。
......或者,你可以尝试(而不是hackish):
[^.][^p][^h][^p]
可能有效,可能不会......它肯定是一种黑客攻击。
答案 3 :(得分:1)
这个很简单,但很难看到。正则表达式中的第二个(。*)是“贪婪的”,因此,它将捕获包括“.php”在内的所有内容,因此,对于解析器的“眼睛”,它之后没有“.php”(它已经通过)和结果是匹配。 :(
只需将第二个。* lazy改为。*?它会解决你的问题:
location ~* /(.*)xyz/(.*?)(?!\.php)(.*)$ {}
我建议你阅读this article,它以比我更好的方式解释它:D
答案 4 :(得分:0)
谢谢大家,我们终于想出了这个
location ~* ^/xyz([^.]*)/([^.]*)$ {
rewrite ^/xyz([^.]*)/([^.]*)$ /xyz$1/index.php/$2 last;
}
它有效。