求助:Azure Windows Docker容器部署Django应用时动态IP引发的ALLOWED_HOSTS错误解决方法
解决Azure App Service动态IP导致Django ALLOWED_HOSTS报错的问题
我之前也碰到过一模一样的问题,Azure的动态IP确实挺头疼的,不过有几个靠谱的解决方案,不用每次改IP折腾:
方案一:配置Django信任Azure的反向代理(最推荐)
Azure App Service本质是通过反向代理把外部请求转发到你的容器里的,所以容器收到的HTTP_HOST其实是内部的动态IP,而不是用户实际访问的域名。这时候我们需要让Django识别并信任这个代理:
- 在
settings.py里添加以下配置:# 告诉Django使用反向代理传来的真实主机头 USE_X_FORWARDED_HOST = True # 让Django识别Azure转发的HTTPS协议(避免协议识别错误) SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') - 然后把你的App Service固定域名加到
ALLOWED_HOSTS里,比如:
这样Django就会用反向代理传来的ALLOWED_HOSTS = [ "your-app-name.azurewebsites.net", # 如果有自定义域名,也一并加上 "www.your-custom-domain.com" ]X-Forwarded-Host(也就是你的真实访问域名)做主机头校验,再也不会管内部的动态IP了。
方案二:用环境变量动态配置ALLOWED_HOSTS
如果你不想硬编码域名,或者需要灵活调整,可以用Azure的应用设置来注入ALLOWED_HOSTS:
- 在
settings.py里读取环境变量:import os # 从环境变量读取,多个域名用逗号分隔 ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", "").split(",") - 登录Azure门户,找到你的App Service,进入配置 > 应用设置,添加一个新的应用设置:
- 名称:
ALLOWED_HOSTS - 值:
your-app-name.azurewebsites.net,www.your-custom-domain.com(多个域名用逗号分隔)
这样每次部署都不用改代码,直接在门户里调整即可。
- 名称:
重要提醒
- 绝对不要在生产环境把
ALLOWED_HOSTS设为*,这会带来主机头攻击的安全风险,一定要指定明确的域名。 - 如果你的应用需要处理Azure的健康检查请求,上面的配置已经足够覆盖,因为健康检查请求也会通过反向代理转发,Django会识别正确的主机头。
内容的提问来源于stack exchange,提问作者Rui
相关产品推荐
相关产品推荐

