我的 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 值。
您的情况是
Host
发送标头,该标头不匹配server_name
配置中的任何指令。Nginx(以及 Apache)将通过在
default_server
项目的上下文中回答请求来解决这个问题,如果没有给出,则从第一个虚拟主机读取中选择。如果主机有不同的 IP 地址,您可以只选择过滤
listen
指令,但如果您共享 IP,规范的方法是创建一个default_server
带有重写规则的专用项目,该规则将始终返回“找不到主机”页面和HTTP 错误,通常是 404。