NGINX if条件不生效及配置语法报错问题求助
问题1:初始配置未返回403的原因
你的geo配置逻辑完全错误,geo模块的核心是根据客户端IP给指定变量赋值,正确语法是:
geo $变量名 { 目标IP段 赋值内容; default 默认赋值内容; }
你当前的配置:
geo $my-ip { default "1.1.1.1/32"; }
会让$my-ip变量无论客户端IP是什么都被设为字符串"1.1.1.1/32",此时if ($my-ip)的条件永远为真(变量非空),理论上所有访问都该返回403。你遇到的情况可能是以下原因导致:
- 修改配置后未执行重载命令:
nginx -s reload,旧配置仍在运行 - 存在其他优先级更高的
server块匹配了myapp-url.xyz,当前server块未被命中 - 客户端访问经过代理,真实IP未被
$remote_addr捕获(geo默认使用$remote_addr),此时需要在代理配置中传递真实IP,或修改geo为geo $http_x_forwarded_for $my-ip;
如果你的需求是阻止1.1.1.1访问,正确配置应为:
# http块内 geo $block_flag { 1.1.1.1/32 1; default 0; } # server块内 if ($block_flag = 1) { return 403; }
问题2:修改后配置报错的原因
你写的if语句存在语法错误:
if (geo $arg_remote_addr $geo) { return 403; }
geo是仅能在http块中定义变量的指令,不能直接用于if的条件判断。你已经通过geo块将$geo变量赋值为1(当客户端IP是1.1.1.1时)或0(其他情况),正确的条件判断应该直接检查变量值:
if ($geo = 1) { return 403; }
内容的提问来源于stack exchange,提问作者Container-Man
相关产品推荐
相关产品推荐

