You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:42:49