Nginx HTTPS 配置重定向到错误的 URL

Nginx HTTPS 配置重定向到错误的 URL

我有 Nginx 与 gunicorn 一起用作上游服务器。我正在尝试将站点配置为使用 HTTPS 并强制所有 HTTP 请求使用 SSL。

这是我的 nginx 配置/etc/nginx/conf.d/site.conf

server {
       listen         80;
       server_name    _;
       return         301 https://$server_name$request_uri;
}



server {
    listen       443 ssl;
    server_name  _;

    ssl_certificate      /etc/ssl/nginx/cert_chain.crt;
    ssl_certificate_key  /etc/ssl/nginx/private.key;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    add_header Strict-Transport-Security "max-age=31536000";

    location / {
        proxy_pass         http://127.0.0.1:8000/;
        proxy_redirect     off;

        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

}

安装此配置后,每当我去: https://example.com/page.html它就会按预期返回页面。

但是当我使用:https://example.com/然后浏览器奇怪地重定向到:https: //_/

当我使用网站的 HTTP 版本时,也会出现此问题 www.example.com

我该如何重写上述配置以使其正常工作?

答案1

您的配置明确指出 HTTP 请求应该重定向到https://_/

       server_name    _;
       return         301 https://$server_name$request_uri;

因为server_name设置为_,这就是用于$server_name

您应该使用的变量而不是$server_nameis $host。这将始终根据浏览器的请求获得一些合理的信息(前提是浏览器请求了一些合理的信息)。

不过,理想情况下,server带有的块server_name _;不应提供除错误页面之外的任何内容。相反,您应该server为实际域名设置块。这样的配置可防止通过未在 nginx 或 Web 应用程序中配置的纯 IP 地址或主机名意外访问您的服务器。

相关内容