为什么Nginx保持redirect到本地主机?

在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知道是'本地主机',django将使用该主机建立URL。

Nginx被用作django和客户端之间的网关,所以它负责改变由django发送的所有重定向url以匹配nginx正在服务的域名。 但行:

  proxy_redirect off; 

告诉nginx“不要这样做,不要重写那个重定向的URL”。 这是导致重定向问题。

你可以做的是:删除该行或更改nginx配置的方式,它会正确地通知django关于域名。 要做到这一点,你应该添加一行:

  proxy_set_header Host $http_host; 

在配置中,nginx会将真实域名传递给django,而不是传递localhost。 这是推荐的方法,因为用那行nginx对django会更透明。 还有其他的头文件配置行,你应该在这里添加,所以在Django的其他东西可以正常工作。 有关所有配置的列表,请参阅您正在使用的wsgi服务器的文档,对于gunicorn,它将在这里 。