我只想为单个页面设置一个位置:
/showthread.php?t=2589&page=3
(以及其他第 1、2 页)
我在配置中写道:
location ~* ^.+showthread\.php\?t=2589.+$ {
该在线测试人员表示该字符串匹配:http://regexr.com?30bk3 但实际上并非如此。WTF?nginx 是否使用了“特殊”正则表达式?如何做出正确的表达?
答案1
使用波浪符号:
location ~ ^.+showthread.php\?t=2589.+$
来表示一个正则表达式,否则 nginx 会将其视为文字。
更新:
抱歉,我读得太快了,关注的是你的拼写错误而不是查询字符串。
因此,诀窍在于“location”与位置(即 /showthread.php)匹配。查询字符串的其余部分是 GET 参数,不会出现在您尝试进行模式匹配的内容中。
看一下文档:
http://wiki.nginx.org/HttpCoreModule#.24args
因此,你需要类似这样的东西:
location /showthread.php {
if ($arg_t = '2589') {
# do some stuff
}
}
答案2
Nginx 位置仅匹配 URI 词干,而不匹配传入的参数(问号后面的内容)。
因此,您的位置需要简单一些,例如
location /showthread.php {/*some stuff*/}
如果你希望根据参数的值实现不同的 nginx 行为,则可能需要使用 if 块里面该位置使用参数上的正则表达式来重写/重定向或执行您需要的任何其他操作。
如果您控制 showthread.php,最好在那里而不是在 nginx 配置中添加这种复杂性。
看此链接了解更多信息。