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

时间:2011-03-29 05:22:29

标签: python django django-forms nginx

正如标题所描述的那样,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 个答案:

答案 0 :(得分:7)

如果您使用的是VirtualHost,则需要在settings.py中设置USE_X_FORWARDED_HOST = True

以下是参考:Django Doc for Settings.py

  

USE_X_FORWARDED_HOST Django 1.3.1中的新功能:请参阅发布   笔记

     

默认值:False

     

一个布尔值,指定是否使用X-Forwarded-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

答案 1 :(得分:4)

<强> EDIT2:

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

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

我认为发生的事情是当您使用httpresponseredirect时,由于HTTP_HOST设置,127.0.0.1:8080标题会将proxy_pass标记为{{1}}。

Django's HttpResponseRedirect seems to strip off my subdomain?

  

Django总是有一些方法   适用于回复。其中之一是   django.utils.http.fix_location_header。   这确保了重定向   响应始终包含绝对值   URI(根据HTTP规范要求)。

答案 2 :(得分: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。例如,在nginx将其发送回客户端之后,来自django的重定向通过apache,http://127.0.0.1:8080/my/test/file.html将变为http://127.0.0.1/my/test/file.html

现在您不必修改django代码。