为什么我的 nginx conf 文件将子域名重定向到主域名?

为什么我的 nginx conf 文件将子域名重定向到主域名?

我已从/etc/nginx/sites-enabled/目录中删除了所有文件。

我还从目录中删除了所有文件/etc/nginx/sites-available/

我只有一个文件,/etc/nginx/conf.d/my-domain-name.com.conf包含:

server {
    listen 80;
    server_name my-domain-name.com www.my-domain-name.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name my-domain-name.com www.my-domain-name.com;

    ssl_certificate /etc/letsencrypt/live/my-domain-name.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/my-domain-name.com/privkey.pem;

    include /etc/letsencrypt/options-ssl-nginx.conf;

    location / {
        proxy_pass http://localhost:4000;
    }
}

我将流量代理到监听端口 4000 的 Docker 容器。

它对my-domain-name.com和非常有效www.my-domain-name.com

然而,它也会重定向全部我在 DNS 中已经定义了子域名。

这不是预期的行为。我只希望此文件为这两个域提供服务,而不是更多。

这里有什么问题?

更新

我添加了另一个文件,sudomain.my-domain-name.com.conf并在其中添加了以下配置:

server {
    listen 80;
    server_name subdomain.my-domain-name.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name subdomain.my-domain-name.com;

    ssl_certificate /etc/letsencrypt/live/my-domain-name.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/my-domain-name.com/privkey.pem;

    include /etc/letsencrypt/options-ssl-nginx.conf;

    location / {
        proxy_pass http://localhost:3131;
    }
}

nginx -t显示成功并被nginx -s reload应用。但是当我再次转到时subdomain.my-domain-name.com,我没有获取在端口 3131 上运行的第二个 docker,而是再次被重定向到my-domain-name.com页面。

答案1

请显示您的子域名的 nginx 配置。

编辑1:

尝试添加此配置文件(根据需要命名):

server {
    listen 80;
    server_name my-subdomain-name.my-domain-name.com www.my-subdomain-name.my-domain-name.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    
    server_name my-subdomain-name.my-domain-name.com www.my-subdomain-name.my-domain-name.com;

    ssl_certificate /etc/letsencrypt/live/my-subdomain-name.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/my-subdomain-name.com/privkey.pem;

    include /etc/letsencrypt/options-ssl-nginx.conf;

    location / {
#      You can change port, url if you wish
        proxy_pass http://localhost:4000;
    }
}

编辑2:

例如,您有这个子域名:test.my-domain.com 然后您必须设置服务器以提供来自该子域名的文件。为此,我们必须创建一个 nginx 配置文件。

答案2

但是,它还会重定向我在 DNS 中定义的所有子域。[...] 这不是预期的行为。我只希望此文件为这两个域提供服务,而不是更多。

如果子域名解析为与托管您实际想要服务的两个域名的服务器相同的 IP 地址,则 Nginx 将被迫处理这些传入请求。

为什么它会将所有流量重定向到我的主域,而明确告知它仅为我的主域提供服务?

这是默认行为。Nginx 会尝试使用HostHTTP 标头将请求路由到适当的服务器,但如果不匹配,它会将流量路由到默认服务器。这似乎是造成混乱的根源。

如果 Host 标头字段与服务器名称不匹配,NGINX Plus 会将请求路由到请求到达端口的默认服务器。默认服务器是 nginx.conf 文件中列出的第一个服务器,除非您在 listen 指令中包含 default_server 参数以明确指定服务器作为默认服务器1

为了真正阻止服务器提供您域的内容(除非有特别请求),您可以添加实际的默认服务器块。如果您愿意,甚至可以对所有请求返回 204 No Content,尽管更细致入微的做法可能总是更好的选择。

相关内容