我有一个 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
- 您没有说明 site2 是否具有与 site1 不同的 IP 地址。如果它们共享相同的 IP 地址,则您正在使用基于名称的虚拟主机,并且您无法根据 IP 访问特定站点(站点是根据域名确定的)。您需要为 site2 分配一个额外的 IP。即为每个站点分配 1 个 IP
- 如果你只想通过 IP 访问 site2 而不关心 site1(你也没有说),其他答案可能适合你。例如将默认站点设置为 site2
- 是的,您还可以操作标头 (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 打开所需的域名。