为啥 Nginx 不断将我重定向到 localhost?
Posted
技术标签:
【中文标题】为啥 Nginx 不断将我重定向到 localhost?【英文标题】:Why does Nginx keep redirecting me to localhost?为什么 Nginx 不断将我重定向到 localhost? 【发布时间】:2015-12-19 04:04:27 【问题描述】:在后端使用带有 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>
【问题讨论】:
表单上的操作是否正确? 我已经从主页添加了表单标签以供参考 我假设您可以通过 get 请求访问 example.com/pagetwo?你在修改你的主机文件吗? 您确实假设正确,但看起来 GwynBleidD 以微弱优势击败您回答。不过感谢您的帮助:) 【参考方案1】:在这种情况下,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;
通过配置中的那一行,nginx 会将真实域名传递给 django,而不是传递 localhost。这是推荐的方式,因为使用该行 nginx 对 django 将更加透明。您还应该在此处添加其他标头配置行,以便 django 中的其他内容可以正常工作。有关所有配置的列表,请参阅您正在使用的 wsgi 服务器的文档,对于 gunicorn,它将是 here。
【讨论】:
谢谢,这解决了我的问题 :) 我会注意到,在这种情况下,proxy_redirect off;
行是在我第一次搜索问题后添加的,但没有它仍然存在。添加proxy_set_header Host $http_host;
是解决方案。再次感谢:)
是的,我的错。删除 proxy_redirect off;
只会在您不使用 unix 套接字时有所帮助,在 unix 套接字上它不会改变任何事情。关于不获取客户端 IP 地址,您必须在 nginx 配置中添加:`proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;`。
再次感谢您,我在您在答案中提供的 nginx 文档链接中找到了 IP 配置。尊敬的好先生:)
【参考方案2】:
我使用了这个组合来解决我的问题
location /
proxy_set_header Host $http_host;
server_name_in_redirect off;
proxy_redirect off;
rewrite ^([^.]*[^/])$ https://my-website-url$1/ permanent; #This will add trailing / to the url which will solve the issue.
【讨论】:
这对我有用。就我而言,我最后使用proxy_pass http://localhost:port
。以上是关于为啥 Nginx 不断将我重定向到 localhost?的主要内容,如果未能解决你的问题,请参考以下文章