Nginx 将子域名的 http 重定向到 https,但显示顶级域名

Nginx 将子域名的 http 重定向到 https,但显示顶级域名

我正在尝试将 nginx 配置为按以下方式工作:顶级域名(例如 example.com)通过 HTTP 访问,重定向到 HTTPS。其所有子域也必须重定向到 HTTPS(显然,子域必须重定向到其自身,但使用 HTTPS)。

以下是配置(文件default):

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

        server_name example.com *.example.com;

        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
        include snippets/ssl-example.com.conf;
        include snippets/ssl-params.conf;

        server_name example.com www.example.com;

        root /home/user/wwwroot;

        index index.html index.htm index.nginx-debian.html;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }
}

以下是“yt”子域名的配置(文件yt

server {
   listen 443 ssl;
   server_name yt.example.com;

   location ^~ /.well-known {
      allow all;
      root /home/user/wwwroot;
   }

   location / {
       proxy_set_header        X-Real-IP       $remote_addr;
       proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Host $http_host;
       proxy_set_header X-Forwarded-Proto $scheme;


       proxy_pass http://localhost:8080;
   }

}

可以看出,yt.example.com 只是将请求传递给应用程序(在本例中为 Youtrack)。

重定向 example.com 和 www.example.com 工作正常,但重定向 yt.example.com 时行为异常。当我访问http://yt.example.com,nginx 重定向到https://yt.example.com,但提供文件root /home/user/wwwroot中指定的内容default。当我点击刷新按钮时,我的浏览器会重新加载页面https://yt.example.com然后 nginx 按照我的预期将请求传递给应用程序。因此,当它将 HTTP 重定向到 HTTPS 时,它不会传递请求,但当请求已经使用 HTTPS 时,它会成功重定向。

我不是 nginx 专家,所以我需要一些帮助。

更新。

@Tim 要求使用“curl -i”,因此这里是输入curl -i yt.example.com

HTTP/1.1 301 Moved Permanently
Server: nginx/1.10.0 (Ubuntu)
Date: Thu, 06 Apr 2017 09:08:26 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Location: https://yt.example.com/

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.10.0 (Ubuntu)</center>
</body>
</html>

这是 curl 的全部输出。

现在 nginx 的日志。错误日志为空(请求不在错误日志中),访问日志包含以下行:

188.242.1.152 - - [06/Apr/2017:09:17:12 +0000] "GET / HTTP/1.1" 301 194 "-" "curl/7.40.0"

并且访问日志不包含其他任何内容。

更新2。

非常抱歉,配置完 nginx 后我忘记清除浏览器的缓存了。所以浏览器实际上没有向我的服务器发出任何请求。

答案1

在您的 http 服务器中,将服务器名称更改为您需要的子域。

server_name example.com www.example.com whatever.example.com;

我不确定这是否会起作用,但这是首先要排除的事情。

如果没有帮助,请使用“curl -i”来演示问题,并匹配 Nginx 访问和错误日​​志。您还应该检查应用程序日志。

顺便说一句,你可能不想在https://example.comhttps://www.example.com。您可以使用类似这样的块将 www 转发到根域。

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    include snippets/ssl-example.com.conf;
    include snippets/ssl-params.conf;

    server_name www.example.com;

    return 301 https://example.com$request_uri;
}

当然,您需要从其他服务器块中删除该域。如果您想在 www 上提供服务并转发根域,那么交换一下就很简单了。

相关内容