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