如何在NGINX配置文件中不使用Lua实现变量间的不区分大小写匹配?
如何在NGINX配置文件中不使用Lua实现变量间的不区分大小写匹配?
你遇到的问题其实是NGINX if指令的一个常见限制——它的正则匹配操作符(~/~*)不支持用变量作为匹配模式,只能写死字面量正则,所以你之前尝试的各种变量写法都不会生效。不过不用Lua也能轻松解决,咱们用NGINX自带的map指令就能实现需求。
解决方案:使用map指令实现变量间的不区分大小写匹配
map是NGINX的http级指令,专门用于根据源变量的值设置目标变量,而且它支持在匹配规则中引用其他变量,也支持不区分大小写的正则匹配(~*)。
完整配置示例
首先在http块中定义map规则,把$foo作为源变量,根据它是否匹配$http_header的模式来设置目标变量$variable:
http { # 保留你原有的其他HTTP级配置(比如include、log_format等) map $foo $variable { default 0; # 默认值设为0 ~* "$http_header" 1; # 不区分大小写匹配$http_header的模式,匹配成功则设为1 } server { # 你的Server级配置(比如listen、server_name等) location / { # 现在可以直接使用$variable变量了,不需要原来的if块 # 比如后续逻辑可以这样用: if ($variable = 1) { # 这里写匹配成功后的操作 } } } }
关键说明
为什么
map能行而if不行?
NGINX的if指令是为简单条件判断设计的,它的正则匹配只支持字面量表达式;而map是专门的变量映射工具,支持在匹配规则中引用其他变量,完美适配你“用变量作为匹配模式”的需求。请求头变量的命名注意
NGINX会自动将请求头转换成规范的变量名:把原头名的大写转小写,连字符(-)换成下划线(_)。比如你的请求头是X-Match-Pattern,对应的变量就是$http_x_match_pattern,别写错变量名哦。正则特殊字符的处理
如果$http_header的值包含正则特殊字符(比如.,*,+等),而你希望把它当作普通字符串匹配,需要先对这些字符进行转义。不过如果你的业务场景中$http_header本身就是正则模式,那直接用就可以了。
备注:内容来源于stack exchange,提问作者ABHISHEK KUMAR SHUKLA
相关产品推荐
相关产品推荐

