Nginx location正则表达式匹配指定URL规则不生效问题咨询
规则失效原因
核心问题出在Nginx的location匹配逻辑上:
location指令仅对请求的URI路径部分做匹配,?以及后面携带的所有查询字符串,在匹配阶段就已经被剥离,不会参与匹配,你正则里写的\?s\=永远不可能命中。- 你要拦截的搜索页(
/?s=、/?s=xxxxxxx),实际URI路径是/,路径部分根本不存在?s=这段内容,自然匹配不到你写的规则。
修正后的配置
查询参数的判断不能写在location的匹配规则里,需要借助Nginx内置变量在块内判断,分两段处理即可覆盖所有要拦截的场景:
# 拦截所有wp-login.php的请求,无论后面携带什么参数 location ~* ^/wp-login\.php$ { deny all; } # 精确匹配根路径,判断是否携带s查询参数 location = / { # 只要查询串包含s参数(无论参数值是否为空),直接拦截 if ($args ~* (^|&)s=) { return 403; } # 此处保留根路径原本的正常业务处理逻辑,比如静态首页解析、反向代理规则等 }
配置重载生效后,你列出的4个URL都会被正常拦截,返回403状态码。
内容的提问来源于stack exchange,提问作者Lorraine1996
相关产品推荐
相关产品推荐

