使用 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
.
我正在尝试将我的网站从 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
.