NGNIX 上托管了多个站点。如何使用 IP 地址访问正确的站点?

NGNIX 上托管了多个站点。如何使用 IP 地址访问正确的站点?

我有一个 IP 地址,比如 192.168.1.20,上面有一个 NGINX 服务器,以子域的形式运行两个 HTTP 站点,比如说:

  • 网站1.域名.com
  • site2.domain.com

如果我通过浏览器访问 site1.domain.com 或 site2.domain.com,我会被引导至正确的网站。如果我访问 192.168.1.20,我会被引导至 site1。

我假设 NGINX 使用标头来选择通过浏览器访问时的适当位置——但我希望能够通过 IP 地址访问 site2.domain.com。我是否需要以某种方式向请求添加特定标头才能执行此操作,或者还有其他方法吗?

答案1

当托管多个网站时,网络服务器将使用标Host:头来确定正在请求哪个网站。如果缺少该标头,则网络服务器将显示默认网站。

当您在浏览器的地址栏中指定域名时,浏览器会Host:为您添加标头。这会告诉服务器正在请求哪个网站。

但是当你在地址栏中指定 IP 地址时,你并没有告诉浏览器应该将哪个 URL 放入Host:标头中。

如果您必须使用 IP 地址来访问您的服务器,请Host:手动添加标头。

答案2

向 server2 块添加默认服务器命令。

server {
  listen 80 default_server;
  server_name example.com;
   # etc
}

答案3

  1. 您没有说明 site2 是否具有与 site1 不同的 IP 地址。如果它们共享相同的 IP 地址,则您正在使用基于名称的虚拟主机,并且您无法根据 IP 访问特定站点(站点是根据域名确定的)。您需要为 site2 分配一个额外的 IP。即为每个站点分配 1 个 IP
  2. 如果你只想通过 IP 访问 site2 而不关心 site1(你也没有说),其他答案可能适合你。例如将默认站点设置为 site2
  3. 是的,您还可以操作标头 (Host:)。您还可以使用 /etc/hosts 条目覆盖 DNS 来访问虚拟主机。

如果没有标题怎么办?

telnet 192.168.1.20 80
Trying 192.168.1.20...
Connected to 192.168.1.20.
Escape character is '^]'.
get /
<!DOCTYPE html>
...
</html>
Connection closed by foreign host.

然后,您就会获得default配置好的网站。如果您想要另一个网站,您可以发送标头或按照选项操作#1

答案4

只需将所需的 IP 地址添加到server_name相应网站的变量中:

server_name 192.168.1.20 site2.domain.com;

或者,您可以创建另一个vhost并使用重定向:

server {
    listen 192.168.1.20:80;
    server_name _;
    return 301 http://site2.domain.com$request_uri;
}

这也应该允许通过 IP 打开所需的域名。

相关内容