2012-02-13 28 views
0

我使用Nginx作爲web服務器,使用gunicorn django服務器的反向代理。Django SSL重定向片段修改,不按預期方式工作

我嘗試使用SSLRedirect片段從這裏:

http://djangosnippets.org/snippets/85/

因爲這個片段將始終從is_secure()返回false與我的設置,導致重定向循環,我不得不做出一些改變。

SSL有效,但是當我訪問http://domain.net/main時,它不會重定向到https://domain.net/main。它不應該這樣做嗎?

下面列出我做了修改:

if 'HTTP_X_FORWARDED_PROTOCOL' in request.META: 
    return True 

在我的nginx的配置(我只需要SSL,HTTP不是必需的):

server { 
listen 8888; 
server_name domain.net; 

ssl on; 
ssl_certificate /path/to/domain.pem; 
ssl_certificate_key /path/to/domain.key; 

# serve directly - analogous for static/staticfiles 
location /media/ { 
    root /path/to/root; 
} 

location /static/ { 
    root /path/to/root; 
} 

location/{ 
    proxy_pass_header Server; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Scheme $scheme; 
    proxy_connect_timeout 10; 
    proxy_read_timeout 10; 
    proxy_pass http://127.0.0.1:8881/; 

    # note this line 
    proxy_set_header X-Forwarded-Protocol https; 
} 
} 

回答

3

只是nginx的做完全。沒有必要在所有涉及到的Django:

server { 
    listen 80; 
    rewrite ^(.*) https://$host$1 permanent; 
} 

server { 
    listen 443; 
    # The rest of your original server config here 
} 
+0

這似乎沒有工作,因爲只使用一個端口(不是443)偵聽8888和端口80正在由別的 – zentenk 2012-02-14 03:14:22

+0

那麼,有什麼問題IM ?如果您無法連接80端口,則無需重新定向任何內容。用戶除了HTTPS之外別無選擇。 – 2012-02-14 15:15:09

+0

是的,但是當用戶通過同一個端口上的HTTP連接時,會彈出錯誤的請求錯誤。我想將用戶連接重定向到端口8888上的http以重定向到https。 – zentenk 2012-02-14 15:57:59