2013-01-03 37 views
13

我有一個相當標準的設置,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; 
    } 
} 
+0

你可以發佈你的conf文件的相關部分與重定向嗎? – ProfessionalAmateur

+0

已更新原始文章的配置和說明。 –

回答

20

請將本文檔的「錯誤處理」一節退房:

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瞭解詳情。

+0

完美 - 正是我所期待的。謝謝。 –

+0

這對我造成了很大的痛苦,解決方案非常簡單,謝謝! – dotz

相關問題