使用 Django 和 Nginx 将 HTTP 正确重定向到 HTTPS

Redirecting correctly HTTP to HTTPS using Django and Nginx

我正在尝试将我的网站从 HTTP 重定向到 HTTPS,我已经部分成功了。问题是,当我键入 mywebsite.fr 时,我在地址栏(例如 Django app/)中获得了包含网站代码的容器的服务名称,并出现 DNS_PROBE_FINISHED_NXDOMAIN 错误。

现在,我在另一台计算机的另一个 Chrome 浏览器上尝试了同样的事情,这次当我输入 www.mywebsite.fr 我得到了相同的结果,而非 www 被正确重定向到安全地址。

最后,我尝试使用我的智能手机 (Brave) 与 www 和非 www 完全相同的过程,我得到 https://djangoapp 错误 ERR_NAME_NOT_RESOLVED 而当我明确键入 https:\mywebsite, 我没有遇到任何问题。

这里是重定向到 HTTPS 服务器的 NGINX 部分:

    server {
            ...

            location / {
                    return 301 https://djangoapp$request_uri;
            }
    }

这是 HTTPS 服务器中指向上游的位置:

server {
           ...

           location / {
                    ...

                    proxy_pass http://djangoapp;
            }
   }

而且,这是运行代码的服务:

  djangoapp:
    build: .
    ports:
      - "8000:80"
    links:
      - db
    depends_on:
      - db

我还没有掌握 NGINX 的所有复杂之处,我也不太明白我在这里做错了什么。我有关于这个问题的任何解决方案或建议吗?

您正在返回您的 django 应用程序 url 而不是将其重定向到您的 http nginx 块。

在配置的 http 部分:

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

而在 https 中,如果您不想让 url 更改为您的 django 应用程序的 url,则在代理通过时,您应该添加 proxy_set_header Host $http_host;。添加一些额外的 headers 也很有用,比如 ip 地址。所以整个服务器块看起来像:

server {
    location / {
         proxy_set_header Host $http_host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_pass http://djangoapp;
    }
}

我的问题已解决,因为我的 proxy_set_header X-Forwarded-Proto 设置为 $https 而不是 https。按照建议使用 $scheme 也可以正常工作。

通过阅读@mehrad 的评论并再次在网络上搜索一点,我发现了重定向无法正常工作的错误。这还包括使用 $host 而不是 djangoapp.