如何在Django视图中获取域名URL?Nginx代理下的异常解决
解决Django+Nginx反向代理下获取真实域名URL的问题
这个问题我之前帮朋友排查过,核心原因是Nginx反向代理时默认不会把用户请求的真实Host头传递给Django,所以Django拿到的是代理指向的内部地址(也就是你看到的127.0.0.1:8000)。下面分两步解决:
1. 修改Nginx配置,传递真实请求头
打开你的Nginx站点配置文件(通常在/etc/nginx/sites-available/或/etc/nginx/conf.d/目录下),在反向代理的location块中添加以下配置:
location / { proxy_pass http://127.0.0.1:8000; # 你的Django服务地址 # 关键:传递真实Host头给Django proxy_set_header Host $host; # 可选:传递客户端真实IP和请求协议(方便后续日志或HTTPS识别) proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; }
添加完配置后,重启Nginx生效:
sudo systemctl restart nginx
2. 配置Django信任反向代理的请求头
打开Django项目的settings.py文件,做以下三项修改:
允许真实域名访问:把你的实际域名添加到
ALLOWED_HOSTS中,避免Django抛出Host校验错误:ALLOWED_HOSTS = ['your-domain.com', 'www.your-domain.com'] # 替换成你的真实域名启用X-Forwarded-Host支持:让Django优先使用代理传递的Host头,而不是内部的代理地址:
USE_X_FORWARDED_HOST = True如果使用HTTPS:添加以下配置,让Django识别代理传递的协议头,避免
build_absolute_uri生成错误的HTTP地址:SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
修改完后,重启你的Django服务(比如uWSGI或Gunicorn):
# 以Gunicorn为例,根据你的实际服务名调整 sudo systemctl restart gunicorn
验证效果
在你的视图中可以加入测试代码,确认是否获取到正确的域名:
def test_domain_view(request): print("当前请求Host:", request.META['HTTP_HOST']) print("生成的完整URL:", request.build_absolute_uri('/')) return HttpResponse("域名测试完成")
此时控制台输出的Host应该是你的真实域名,而不是127.0.0.1:8000了。
内容的提问来源于stack exchange,提问作者hoangquyy
相关产品推荐
相关产品推荐

