2012-02-14 221 views
1

我使用nginx與反向代理到我的gunicorn django服務器在本地運行我的django應用程序。nginx重寫導致重定向循環

我試圖從任何http請求強制ssl,因爲該網站只是打算https訪問。該應用程序將只收聽8888端口(取80和443),所以該站點只能在指定8888端口時訪問。

我試圖在服務器塊和位置塊中用這個rewrite^https://domain.net:8888$request_uri? permanent;重寫。它不僅不會將http請求重定向到相同的url,而且在有https請求時也會導致重定向循環。

server { 
    listen 8888; 
    server_name sy-system.net; 
    rewrite^https://domain.net:8888$request_uri? permanent; 

    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/{ 
     #rewrite^https://sy-system.net:8888$request_uri? permanent; 
     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/; 
     proxy_set_header X-Forwarded-Protocol https; 
    } 
    # what to serve if upstream is not available or crashes 
    error_page 500 502 503 504 /media/50x.html; 
} 

回答

2

您無條件地從domain.net:8888重定向到domain.net:8888。無限重定向循環是唯一可能的結果。

無論如何,你試圖做的事情是不可能的。 Nginx正在談論SSL,你的瀏覽器不是,所以它們之間不會有數據傳輸(這就是爲什麼當用普通的HTTP連接時你沒有獲得重定向循環)。當他們談論(通過SSL)你的重定向循環接管。

+0

耶剛剛實現,謝謝 – zentenk 2012-02-14 12:03:39