我可以使用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来处理这个?

**注意我在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; } } 

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

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