为什么Nginx会继续将我重定向到localhost?

时间:2015-09-22 08:48:00

标签: django redirect nginx localhost gunicorn

在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>

1 个答案:

答案 0 :(得分:11)

在这种情况下,django正在侦听一些unix套接字,并且nginx发送给django的所有请求都是本地的,所以django看到的主机是&#39; localhost&#39;。

当您提交表单时,Django必须为任何重定向构建完整的URL。因为只有域django知道是&#39; localhost&#39;,所以django将使用该主机构建URL。

Nginx用作django和客户端之间的网关,因此它负责更改django发送的所有重定向URL,以匹配nginx正在服务站点的域名。但是行:

        proxy_redirect off;

告诉nginx&#34;不要这样做,不要重写重定向网址&#34;。这导致重定向问题。

您可以做的是:删除该行或更改nginx配置,以便正确通知django有关域名的信息。要做到这一点,你应该添加一行:

        proxy_set_header Host $http_host;

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