You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否根据客户端IP为Nginx配置不同的server_name?

实现Nginx按客户端IP网段设置不同server_name

这个需求完全可以实现,以下是具体配置方案:

1. 定义IP网段标识变量

在Nginx的http块中添加geo配置,用来判断客户端IP是否属于目标局域网段:

geo $is_local_client {
    default 0;
    192.168.1.0/24 1;
}
  • default 0:默认将非局域网客户端标记为0
  • 192.168.1.0/24 1:匹配该网段的客户端标记为1

2. 映射标识到目标server_name

在http块中添加map配置,将上面的标识变量映射到对应的域名:

map $is_local_client $target_server_name {
    1 www.local;
    0 www.my-website.com;
}

3. 应用到HTTP/HTTPS服务

在HTTP和HTTPS的server块中,直接使用映射后的变量作为server_name:

HTTP服务配置

server {
    listen 80;
    server_name $target_server_name;

    # 站点业务配置示例
    root /var/www/html;
    index index.html;
}

HTTPS服务配置

注意:HTTPS需要使用包含www.local和www.my-website.com两个域名的SSL证书(SAN证书),否则会出现证书不匹配错误:

server {
    listen 443 ssl;
    server_name $target_server_name;

    ssl_certificate /path/to/your/certificate.pem;
    ssl_certificate_key /path/to/your/private-key.pem;

    # SSL优化配置示例
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # 站点业务配置示例
    root /var/www/html;
    index index.html;
}

补充方案(不推荐)

若不想使用map模块,也可通过set+if组合实现(Nginx官方建议尽量避免在server块中使用if,易引发逻辑冲突):

server {
    listen 80;
    server_name www.local www.my-website.com;

    set $server_name_var www.my-website.com;
    if ($remote_addr ~ ^192\.168\.1\.) {
        set $server_name_var www.local;
    }

    # 后续可通过$server_name_var区分业务逻辑
}

内容的提问来源于stack exchange,提问作者JamesThomasMoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 06:40:08