我可以根据客户端 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 会传递维护主机。