NGINX 重定向错误的子域名

NGINX 重定向错误的子域名

我已将 NGINX 设置为仅接受端口 443 上的 HTTPS 流量,并且我想将所有非 HTTPS 流量从端口 80 重定向到 HTTPS。

我还有多个想要独立管理的子域。

我将从我的配置中发布一个示例,但会省略一些无聊的内容。

普通用户应该能够浏览的主要网站:

server
{
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name www.myserver.com;

    root /var/www/www.myserver.com;

    index index.php index.html index.htm;
}

其中一个子域名:

server
{
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name subdomain.myserver.com;

    location /
    {
        proxy_pass https://127.0.0.1:8500;
    }
}

现在我想将流量从端口 80 重定向到 HTTPS:

server
{
    listen 80;
    listen [::]:80;

    server_name subdomain.myserver.com;

    return 301 https://subdomain.myserver.com$request_uri;
}

问题:全部子域名将自动重定向至“https://subdomain.myserver.com",即使它们与重定向块中指定的服务器名称不匹配。

http://www.myserver.com“(没有配置块)将被重定向到”https://subdomain.myserver.com“即使它与 server_name 不匹配

答案1

添加“捕获全部”服务器块,据记载

server {
    listen 80 default_server;
    server_name _;
    server_name_in_redirect off;
    location / {
        return 404;
    }
}

导致“重定向”的另一个可能原因是HSTS 头。一旦客户端看到includeSubDomains主域上设置的 HSTS 标头,它也会尝试直接使用 HTTPS 访问其子域,而无需先尝试 HTTP。

答案2

根据链接https://nginx.org/en/docs/http/request_processing.htmlDrifter104 评论中给出,配置中遇到的第一个特定端口的服务器定义被假定为默认端口,这就是为什么所有子域都重定向到第一个服务器定义。尝试/etc/nginx/conf.d/default_server.conf使用以下内容创建配置:

server {
    listen  80     default_server;
    server_name default.myserver.com;
    location / {
        return 404;
    }
}
server {
    listen 443 ssl default_server;
    server_name default.myserver.com;
    location / {
        return 404;
    }
}

重新启动 nginx 后,所有未在配置中明确列出的域名都将显示 404 错误。

相关内容