Django不停将URL从http://localhost/改为http://127.0.0.1:8080/
正如标题所说,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 个回答
我也遇到过同样的问题(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代码了。
如果你在使用虚拟主机(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
编辑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规范要求的)。