我有一個相當標準的設置,nginx前面有一個django應用。我希望django應用程序僅用於SSL,因此我在nginx conf中有兩個偵聽塊,端口80(HTTP)上的流量重定向到端口443(SSL)。這是按預期工作的。我可以使用Nginx重定向SSL端口上的非SSL流量嗎
我在啓用了端口轉發的虛擬機中運行此設置,以便我可以通過端口8080(HTTP)或8081(SSL)從主機瀏覽器站點。再次,這個工作正常,正如所料。
在註冊工作流程中,我從Django應用程序內部重定向時出現問題。由於Django從未看到SSL狀態(SSL在nginx處終止,並且應用程序的流量通過HTTP在端口5000上轉發),但確實看到端口,重定向正在變得**。
所有這一切的最終結果是,我將流量導向到SSL端口上的nginx,即不是SSL,例如, http://127.0.0.1:443/
。有沒有辦法配置nginx來處理這個問題?
** NB我在Nginx中設置了X-Forwarded-Proto頭文件,並且Django正在拾取正確的.is_secure()值,這是外部庫沒有檢查is_secure並且剛剛重定向的特定問題傳入的URL方案。
[UPDATE 1]
附上相關的配置設置。這是從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)
使用上述端口轉發配置,如果我瀏覽到HTTP端口(8080)上的主機上的網站,則該請求被接受,和nginx(見下文)將此請求重定向到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的其中混合方案&協議得到重定向內部出現的問題,並與到http:\\127.0.0.1:8081\...
的請求,從而未能結束,作爲nginx的是希望8081上的流量成爲SSL。
我真正想要的是一條規則,說'在443上監聽SSL和非SSL並重定向非SSL'。
這是有關nginx的配置:
# 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;
}
}
你可以發佈你的conf文件的相關部分與重定向嗎? – ProfessionalAmateur
已更新原始文章的配置和說明。 –