Django不停将URL从http://localhost/改为http://127.0.0.1:8080/

4 投票
3 回答
6248 浏览
提问于 2025-04-16 14:37

正如标题所说,Django总是把我的网址从 /localhost/ 改成 /127.0.0.1:8080/,这让我用Nginx来提供静态文件时总是出问题。有人知道为什么会这样吗?谢谢!

/**编辑**/

这是Nginx的配置:

server {

    listen   80; ## listen for ipv4
    listen   [::]:80 default ipv6only=on; ## listen for ipv6

    server_name  localhost;

    access_log  /var/log/nginx/localhost.access.log;

    location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$
    {
            root   /srv/www/testing;
    }

    location / {
            proxy_pass         http://127.0.0.1:8080/;
            proxy_redirect     off;
    }

    location /doc {
        root   /usr/share;
        autoindex on;
        allow 127.0.0.1;
        deny all;
    }

    location /images {
        root   /usr/share;
        autoindex on;
    }

这是Apache的配置文件:

<VirtualHost *:8080>

    ServerName testing
    DocumentRoot /srv/www/testing

    <Directory /srv/www/testing>
        Order allow,deny
        Allow from all
    </Directory>

    WSGIScriptAlias / /srv/www/testing/apache/django.wsgi

</VirtualHost>

3 个回答

1

我也遇到过同样的问题(django的重定向在浏览器中显示时会带上“:8080”)。经过进一步的搜索,我找到了一些关于nginx的信息。下面的内容解决了这个问题……

在你的nginx配置中,把……

  proxy_redirect    off;

替换成……

  proxy_redirect   http://127.0.0.1:8080/ http://127.0.0.1/;

记得重启你的nginx服务。这样做会让nginx在从apache返回到浏览器的数据包中去掉8080。例如,从django通过apache的重定向,http://127.0.0.1:8080/my/test/file.html 会变成 http://127.0.0.1/my/test/file.html,然后nginx再把它发送给客户端。

现在你就不需要修改你的django代码了。

7

如果你在使用虚拟主机(VirtualHost),你需要在你的settings.py文件中设置USE_X_FORWARDED_HOST = True。

这里有个参考链接:Django的settings.py文档

USE_X_FORWARDED_HOST是Django 1.3.1新增加的功能:请查看发布说明。

默认值:False

这是一个布尔值,表示是否优先使用X-Forwarded-Host这个头信息,而不是Host头信息。只有在使用了设置了这个头信息的代理时,才应该启用这个选项。

这里有一些示例代码:

import os, socket
PROJECT_DIR = os.path.dirname(__file__)

on_production_server = True if socket.gethostname() == 'your.productionserver.com' else False

DEBUG = True if not on_production_server else False
TEMPLATE_DEBUG = DEBUG

USE_X_FORWARDED_HOST = True if not on_production_server else False
4

编辑2:

http://wiki.nginx.org/HttpProxyModule#proxy_redirect

http://wiki.nginx.org/HttpProxyModule#proxy_pass

我认为发生的事情是,当你使用 httpresponseredirect 时,HTTP_HOST 这个头信息给了你 127.0.0.1:8080,这是因为你的 proxy_pass 设置。

Django的HttpResponseRedirect似乎去掉了我的子域名?

Django有一些方法会自动应用到响应上。其中一个就是 django.utils.http.fix_location_header。这个方法确保重定向的响应总是包含一个绝对的URI(这是HTTP规范要求的)。

撰写回答