2015-09-22 41 views
3

與Gunicorn後端使用Django,我每提交一個表單和我認爲的時間要發送到example.com/pagetwo我送到localhost/pagetwo代替。爲什麼Nginx會將我重定向到本地主機?

我是新來的Nginx所以如果有人能指出問題是什麼我最感激:)

default.conf:

server { 
    listen  80; 
    server_name example.com; 

    location /static/ { 
     root /srv; 
    } 

    location/{ 
     proxy_redirect off; 
     proxy_pass http://unix:/srv/sockets/website.sock; 
    } 

    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
     root /usr/share/nginx/html; 
    } 
} 

下面是從指數形式頁:

<form id='formone' method='POST' action=''> {% csrf_token %} 
    {{ form.as_p }} 
    <br /> 
    <button type="submit" class="btn btn-success btn-sm">Submit</button> 
</form> 
+0

是您的窗體上的動作是否正確? – cdvv7788

+0

我從參考 – derrend

+0

我認爲你可以得到一個GET請求example.com/pagetwo主頁添加表單標籤?你在修改你的hosts文件嗎? – cdvv7788

回答

10

在這種情況下,Django是聽一些Unix套接字和發送nginx的以Django的所有請求都是本地的,所以主機的Django看到的是「localhost」的。

當你提交表單的Django必須建立完整URL重定向任何。因爲只有域名django知道是'localhost',所以django將使用該主機建立URL。

的Nginx作爲Django和客戶端之間的網關,所以它是負責改變由Django的發送,以匹配域名nginx的是在服務站點的所有重定向的URL。但行:

 proxy_redirect off; 

告訴nginx「不要這樣做,不要重寫該重定向網址」。這是導致重定向問題。

你可以做的是:刪除該行或方式,它會正確地告知Django的有關域名更改nginx的配置。要做到這一點,你應該添加一行:

 proxy_set_header Host $http_host; 

隨着配置該行響應,Nginx將通過真實域名的Django強似本地主機。這是推薦的方式,因爲對於django,nginx會更透明。還有其他的頭文件配置行,你應該在這裏添加,所以在Django的其他東西可以正常工作。有關所有配置的列表,請參閱您正在使用的wsgi服務器的文檔,對於gunicorn,它將是here

+1

謝謝,這解決了我的問題:) 我只會注意到,在這種情況下'proxy_redirect off;'行被添加後,我第一次搜索問題仍然存在沒有它。添加'proxy_set_header主機$ http_host;'是解決方案。再次感謝:) – derrend

+0

是的,我的壞。刪除'proxy_redirect off''只會幫助你如果你不使用unix套接字,在unix套接字上它不會改變一件事情。關於不獲取客戶端IP地址,您必須添加到您的nginx配置:'proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;'。 – GwynBleidD

+0

再次感謝您,我在答案中找到了您在nginx文檔鏈接中提供的IP配置。榮譽善良的先生:) – derrend

相關問題