nginx 不尊重 server_name

nginx 不尊重 server_name

我的 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。

相关内容