moneyslow.com

Nginx 根据请求来源 IP 地址决定是否进行 301 跳转

nginx

nginx

如果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 的情况。

Exit mobile version