2012-09-17 70 views
2

我在亞馬遜網站上的ELB級別爲我的網站提供SSL認證。我用下面的站點設置一箇中間件所有http請求轉發到httpsssl with AWS上的django

http://djangosnippets.org/snippets/2472/

它的工作很大。但這是我的問題。每個請求都會被轉發,所以我發現點擊鏈接時會有輕微的延遲,等等。但是有沒有辦法強制django通過https來做所有事情?當我的代碼爲HttpResponseHttpResponseRedirect時,如何將其默認爲https而不是http?我試圖搜索這個,並沒有成功...

我知道這是可能的,如果我輸入https://www...爲每個URL重定向和頁面的鏈接,但我想避免這樣做,如果可能的話。

+0

現在有一種正確的方式在Django中正確構建URL,這意味着不必依賴中間件或Web服務器配置來重定向每次點擊。請參閱下面的回覆 - 首先使用正確的協議構建網址。 – lukewarm

回答

1

我們使用Nginx的當前負載平衡,力SSL的請求,並終止SSL連接,因爲它們代理到內部應用服務器。它並不具備奇特的負載平衡功能,但Nginx的體積小巧而且足夠快,可以放在任何地方。

下面的代碼位可能需要:

# listen on port 80 and redirect to SSL. 
server { 
    listen   80; 
    server_name site.com; 
    rewrite  ^https://$server_name$request_uri? permanent; 
} 

# listen on port 443, terminate SSL, and proxy to internal web app 
# can be node, rails, whatever. 
server { 
    listen 443; 
    server_name site.com; 
    gzip on; 
    client_max_body_size 250M; 

    ssl on; 
    ssl_certificate /etc/nginx/site.com.crt; 
    ssl_certificate_key /etc/nginx/site.com.key; 
    keepalive_timeout 70; 

    location/{ 
    proxy_pass http://127.0.0.1:8080; 
    # We add this extra header just so proxied web app 
    # knows this used to be an SSL connection. 
    proxy_set_header x-https 1; 
    include /etc/nginx/conf.d/proxy.conf; 
    } 
} 
2

看着你發佈的中間件,它正在做你剛纔提到的你不想手動做的事情,例如https附加到來自你的域的每個收到的http請求。我建議你將這個工作卸載到前端服務器(nginx或apache)。

例與

2

當Django建立絕對URI重定向到,它會檢查request.is_secure決定它應該使用什麼協議方案(HTTP,HTTPS或FTP) 。

Django默認會根據請求使用的協議進行此操作,但正如您已經確定的那樣,當在LB或代理後面時,由於LB /代理級別的SSL終止,這可能是錯誤的。

您可以配置Django以使用SECURE_PROXY_SSL_HEADER設置檢測此確切方案。