我的 nginx 服务器上有两个虚拟主机,它们有各自的域名。一个是 http 的,因为它是一个静态站点(siteA),另一个是 https 的(siteB)。对于 siteB,我有一个从 http 访问到 https 访问的永久重定向。
配置siteA
为
server {
listen 80;
listen [::]:80;
server_name siteA.example.com;
...
location / {
...
}
}
配置siteB
为
server {
listen 80;
listen [::]:80;
server_name siteB.example.com;
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name siteB.example.com;
...
location / {
...
}
}
问题是当我访问时,https://siteA.example.com
我会返回https://siteB.example.com
。我该如何避免这种情况?
我是否必须使用listen siteB.example.com:443 ssl;
而不是简单地使用listen 443 ssl;
?
我希望server_name
指定与 HTTP 请求中的 HOST 值匹配的服务器名称。
答案1
您的情况是,发送的标头与配置中的Host
任何指令均不匹配。server_name
Nginx(以及 Apache)将通过在项目上下文中回答请求来解决此问题default_server
,如果没有给出,则从读取的第一个虚拟主机中选择。
如果主机有不同的 IP 地址,您可以选择过滤指令listen
,但如果您共享 IP,规范的方法是创建一个default_server
带有重写规则的专用项目,该项目将始终返回“找不到主机”页面和 HTTP 错误,通常为 404。