在Gunicorn的后端使用Django,每次我提交表单并且应该发送到example.com/pagetwo时,我会被发送到localhost / pagetwo.
我是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>
解决方法:
在这种情况下,django正在侦听一些unix套接字,并且nginx发送给django的所有请求都是本地的,所以django看到的主机是“localhost”.
当您提交表单时,Django必须为任何重定向构建完整的URL.因为只有域django知道是’localhost’,所以django将使用该主机构建URL.
Nginx用作django和客户端之间的网关,因此它负责更改django发送的所有重定向URL以匹配nginx为站点提供服务的域名.但是行:
proxy_redirect off;
告诉nginx“不要那样做,不要重写那个重定向URL”.这导致重定向问题.
您可以做的是:删除该行或更改nginx配置,以便正确通知django域名.要做到这一点,你应该添加行:
proxy_set_header Host $http_host;
在config中使用该行,nginx会将真实域名传递给django而不是传递localhost.这是推荐的方法,因为使用该行nginx对django会更透明.还有其他标题配置行,你应该在这里添加,所以django中的其他东西可以正常工作.有关所有配置的列表,请参阅您正在使用的wsgi服务器的文档,对于gunicorn,它将是here.