如何根据主机设置 nginx 根路径

如何根据主机设置 nginx 根路径

如何设置访客主机在 nginx 中使用特定的根路径?

IP 为 1.1.1.1 的访问者将使用

root /srv/web1

所有其他访客将使用

root /srv/web2

答案1

虽然这个问题很容易回答,只要做一点研究和阅读文档(最好从新手指南进而nginx 如何处理请求),无论如何我都会回答。

我假设您有一个具有多个网络接口和 IP 地址的服务器,其中 1.1.1.1 地址分配给一个接口,其他地址分配给它们各自的接口。

Nginx 在这方面非常灵活,事实上,server当 nginx 无法通过 : 匹配任何其他服务器块时,总会有一个块被用作默认块,server_nameserver文件的第一个块或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块内;上面的代码片段应该按原样工作,但由于我没有测试过它,所以我不能保证任何事情。

相关内容