为啥 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?的主要内容,如果未能解决你的问题,请参考以下文章

Apache Shiro:将我重定向到登录页面

localhost 将我重定向到另一个 url

Wordpress wp-admin 将我重定向到不同的域

Route 没有将我重定向到正确的页面。它只是向我显示相同的页面,但网址发生了变化

虚拟主机将我重定向到 Xampp 仪表板

国家/地区地理位置将我重定向到错误的链接?