如果ip很少的情况:
server {
listen 80;
server_name x.com;
access_log /var/log/nginx/x.com.log;
error_log /var/log/nginx/x.com.error.log;
# 如果请求来源 IP 是 192.168.0.1,则不跳转
if ($remote_addr = "192.168.0.1") {
# 不进行任何操作,继续处理请求
break;
}
# 其他 IP 进行 301 跳转
return 301 https://x.com$request_uri;
}
解释:
if ($remote_addr = “192.168.0.1”):判断请求的来源 IP 是否为 192.168.0.1。
break;:如果条件成立,则不进行跳转,继续处理请求。
return 301 https://x.com$request_uri;:如果条件不成立,则执行 301 跳转。
注意事项:
使用 if 指令时要注意性能问题,尤其是在高并发场景下。if 指令在某些情况下可能会导致性能下降,因此建议在测试环境中充分测试后再应用到生产环境。
如果有多个 IP 需要排除跳转,可以使用 map 指令来优化配置,避免多个 if 语句。
如果有多个 IP 需要排除跳转,可以使用 map
指令来优化配置:
map $remote_addr $skip_redirect {
default 1;
192.168.0.1 0;
192.168.0.2 0;
# 添加其他需要排除的 IP
}
server {
listen 80;
server_name x.com;
access_log /var/log/nginx/x.com.log;
error_log /var/log/nginx/x.com.error.log;
if ($skip_redirect = 0) {
# 不进行跳转
break;
}
# 其他 IP 进行 301 跳转
return 301 https://x.com$request_uri;
}
在这个配置中,map
指令用于定义一个变量 $skip_redirect
,根据 $remote_addr
的值来决定是否跳过跳转。这样可以更高效地处理多个 IP 的情况。