在 Nginx 中,if
指令只能放在 location
块内,不能直接放在 server
块内。这样做是因为 Nginx 的配置语法和处理流程的设计。
如果你需要根据请求的 Host 来返回 403 状态码,最好的方式是在 location
块中进行判断。例如,可以这样组织你的配置:
server {
listen 7070;
location / {
if ($host != "10.19.29.110" ) {
return 403;
}
if ($host != "127.0.0.1") {
return 403;
}
# 正常情况下代理到后端服务
proxy_pass http://your_backend_service;
}
}
更佳方案
为了避免使用多个 if
条件,可以使用更简洁的方法,如下:
server {
listen 7070;
location / {
set $allowed_host 0; # 默认不允许
if ($host = "10.19.29.110") {
set $allowed_host 1; # 设置为允许
}
if ($host = "127.0.0.1") {
set $allowed_host 1; # 设置为允许
}
if ($allowed_host = 0) {
return 403; # 返回403 Forbidden
}
# 正常情况下代理到后端服务
proxy_pass http://your_backend_service;
}
}
总结
if
指令应该放在location
块中。- 尽量减少
if
使用以提高性能,考虑使用其他方法来实现需求,例如通过定义变量或直接通过不同的 server 块来处理特定的 host。
内容由零声教学AI助手提供,问题来源于学员提问