根据客户端ip获取Nginx文档根目录?

根据客户端ip获取Nginx文档根目录?

我可以根据客户端 ip 在 nginx 上提供不同的文档根目录吗?基本上,我希望相同的 url 为我的客户端 ip 提供我的代码的不同分支。

例如,我期望的配置如下:

server {
  listen 80;
  server_name some.server.name;

  client_max_body_size 10M;

  gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/json;

  root {{ deploy_directory }};

  location /robots.txt {}

  if ($remote_addr ~ "^(<ip>|<ip>|<ip>)$") {
    root <some other root>
  }

  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    log_not_found off;
    gzip_static on;
    expires     max;
    add_header  Cache-Control public;
    add_header  Last-Modified "";
    add_header  ETag "";
    break;
  }
}

但这并没有加载

答案1

这应该有效:

root /$root;

set $root default/path;
if ($remote_addr ~ "^(127\.0\.0\.1|10\.20\.30\.40|111\.222\.33\.44)$") {
    set $root another/path;
}

不要忘记在 IP 正则表达式中转义点。

答案2

您还可以将 Alexey Ten 的答案与 geo 模块结合起来,如中所述Nginx - 如何将特定 IP 的用户重定向到特殊页面 由于 CIDR 表示法和范围支持,这使得匹配多个 IP 地址变得更加容易。

例如

geo $geo_host {
    default       0;
    127.0.0.1/16  1;
    1.2.3.4       1;
}

server {
    ... # Skipping details unrelated to this example.
    root /$root;

    set $root default/path;
    if ($geo_host = 1) {
        set $root other/path;
    }
}

这也可以与代理结合使用,例如 Varnish。此示例仅包含内容server {},请参阅geo上例中的块。

server {
    ... # Skipping details unrelated to this example.

    set $proxy_host maintenance.example.org;
    location / {
        if ($geo_host = 1) {
            set $proxy_host $host;
        }

        proxy_pass http://varnish;
        proxy_set_header Host $proxy_host;
        ... # Your other proxy config.
    }
}

此示例将geo白名单之外的所有人重定向到维护页面(由 Varnish 缓存之后的任何 http 服务器提供)。对于白名单上的用户,Varnish 会传递真实主机,而对于白名单外的用户,Varnish 会传递维护主机。

相关内容