如何设置访客主机在 nginx 中使用特定的根路径?
IP 为 1.1.1.1 的访问者将使用
root /srv/web1
所有其他访客将使用
root /srv/web2
答案1
虽然这个问题很容易回答,只要做一点研究和阅读文档(最好从新手指南进而nginx 如何处理请求),无论如何我都会回答。
我假设您有一个具有多个网络接口和 IP 地址的服务器,其中 1.1.1.1 地址分配给一个接口,其他地址分配给它们各自的接口。
Nginx 在这方面非常灵活,事实上,server
当 nginx 无法通过 : 匹配任何其他服务器块时,总会有一个块被用作默认块,server_name
即server
文件的第一个块或default_server
在其listen
指令中指定的块。请记住listen
您可以在指令中指定 IP。
就你的情况而言,这意味着:
server {
listen 80 default_server;
root /srv/web2;
[...]
}
server {
listen 1.1.1.1:80;
root /srv/web1;
[...]
}
正如您在上面的示例中看到的,第一个server
块监听端口 80 上的所有接口,而第二个块仅监听端口 80 上的 1.1.1.1 接口。因此,通过 1.1.1.1 网络接口访问您网站的任何人都会从 /srv/web1 接收文件,与 HTTP 请求中的 Host 字段(即 URL 栏中写的域名)无关。
通过将 IP 地址放入指令中可以获得另一个类似的行为server_name
,如下所示:
server {
listen 80;
server_name 1.1.1.1;
[...]
}
* 请注意,最后一个server
块仅捕获对文字 IP 地址的请求,而不是对域名的请求。
我希望这能回答您的问题,但下次请提供有关您当前设置的更多信息并进行一些研究。
更新
为了获得所描述的行为,您可以使用地理模块正如解释的那样这个问题:
geo $client {
default web2;
1.1.1.1 web1;
}
server {
[...]
root /srv/$client;
[...]
}
此配置使用地理模块根据客户端的 IP 地址设置变量 ( $client
)。该变量设置为默认web2或具体web1然后在root
指令中替换。
请注意,geo
指令必须位于http
块内而不是server
块内;上面的代码片段应该按原样工作,但由于我没有测试过它,所以我不能保证任何事情。