微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以使用NginxredirectSSL端口上的非SSLstream量吗?

我有一个相当标准的设置与Nginx面向django应用程序。 我想django的应用程序只有SSL,所以我有两个监听块在我的Nginx conf中,stream量进入端口80(HTTP)被redirect到端口443(SSL)。 这是按预期工作。

我在启用端口转发的虚拟机中运行此设置,以便通过转到端口8080(HTTP)或8081(SSL)从主机浏览器站点。 再次,这个工作正常,如预期。

当我在注册工作stream程中从Django应用程序内部redirect时出现问题。 因为Django永远不会看到SSL状态(SSL在Nginx上终止,并且通过HTTP在端口5000上转发到应用程序的stream量),但是看到端口,redirect正在变得**。

所有这一切的净结果是,我有stream量被引导到SSL端口上的Nginx,这不是SSL,例如http://127.0.0.1:443/ 。 有没有办法configurationNginx来处理这个?

会话variablesNginx / ruby​​ / thin server setup的模糊行为

使用Apache2(或Nginx)处理Http请求。 是否为每个或一组N个请求创build一个新的进程?

本地Azure服务Fabric群集的负载平衡器

如何通过厨师更新Nginx

Nginx显示欢迎页面

**注意我在Nginx中设置了X-Forwarded-Proto头文件,而且Django正在提取正确的.is_secure()值,这是外部库不检查is_secure并只是在传入的URLscheme上redirect的一个特定问题。

[更新1]

附件是相关的configuration设置。 这是从Vagrantfile本身,显示端口转发:

config.vm.forward_port 80,8080 # website,via Nginx (redirects to SSL:8081) config.vm.forward_port 443,8081 # website,via Nginx (accepts SSL) config.vm.forward_port 5000,8180 # website,via gunicorn (direct)

使用上面的端口转发configuration,如果我浏览到HTTP端口(8080)上的主机上的站点,则接受请求,并且Nginx(见下文)将此请求redirect到HTTPS(在端口8081上运行)。 一旦我在HTTPS网站本身工作正常:

(host) http://127.0.0.1:8080 -> forwarded to -> (guest vm) http://127.0.0.1:80 (host) https://127.0.0.1:8081 -> forwarded to -> (guest vm) https://127.0.0.1:443

当我从混合模式和协议的Django内部获得一个redirect的内容时,会发生这个问题,并最终以http:\127.0.0.1:8081...的请求结束,因为Nginx期望8081上的stream量是SSL。

我真正想要的是一个规则,说“监听443 SSL和非SSL,并redirect非SSL”。

这是相关的Nginxconfiguration:

# Django app is served by Gunicorn,running under port 5000 (via Foreman) upstream gunicorn { server 127.0.0.1:5000 fail_timeout=0; } server { listen 80; # 8081 is the port I am forwarding to on the host machine rewrite ^ https://127.0.0.1:8081$request_uri? permanent; } server { listen 443; ssl on; ssl_protocols SSLv3 TLSv1; ssl_ciphers HIGH:!ADH:!MD5; ssl_prefer_server_ciphers on; ssl_certificate /etc/Nginx/ssl/self-signed.crt; ssl_certificate_key /etc/Nginx/ssl/self-signed.key; access_log /var/log/Nginx/access.log; error_log /var/log/Nginx/error.log; location /static/ { alias /app/static/; } location /media/ { alias /app/media/; } location / { # everything else is to be served by the django app (upstream 'gunicorn') proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # this is set to ensure that django is_secure returns True proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_pass http://gunicorn; } }

烧瓶redirect(url_for)错误与gunricorn + Nginx

用gunicorn使用Nginx的目的是什么?

密码保护/ backoffice文件夹在Nginx

Nginx的Http Referer主机

PHP-FPM – 上游提前closures连接,同时读取响应头

您应该查看本文档的“错误处理”部分:

http://Nginx.org/en/docs/http/ngx_http_ssl_module.html

可以使用非标准错误代码497来处理已发送到HTTPS端口的普通HTTP请求。

像这样的东西应该工作(未经测试):

error_page 497 https://$host$request_uri;

命名的位置也可以在error_page中使用,详情请参阅http://Nginx.org/r/error_page 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐