2015-09-22 42 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

相关问题