Django部署GAE如何配置ALLOWED_HOSTS支持所有版本域名访问
问题原因
Django的ALLOWED_HOSTS子域通配规则是按DNS点分层级匹配的,GAE的版本域名[版本号]-dot-myapp.ey.r.appspot.com从DNS层级上属于ey.r.appspot.com的子域,你原有配置仅添加了主应用域名,自然会拦截所有版本域名的访问请求。
不需要担心通配范围过大的安全问题:GAE前端网关会先做路由校验,只有目标Host属于你当前项目的请求才会被转发到Django实例,同域下其他用户项目的请求根本不会到达你的应用,不存在Host头攻击风险。
配置方法
修改现有GAE环境分支的配置,将.ey.r.appspot.com加入允许主机列表,同时给CSRF_TRUSTED_ORIGINS添加对应通配源即可,另外建议补充代理SSL头配置,避免GAE反向代理场景下出现HTTPS重定向循环。
修改后的完整配置代码如下:
from urllib.parse import urlparse APPENGINE_URL = env("APPENGINE_URL", default=None) if APPENGINE_URL: if not urlparse(APPENGINE_URL).scheme: APPENGINE_URL = f"https://{APPENGINE_URL}" ALLOWED_HOSTS = [ urlparse(APPENGINE_URL).netloc, '.ey.r.appspot.com', # 匹配所有GAE分配的版本、服务级别的appspot域名 'my-personal-domain.com' ] CSRF_TRUSTED_ORIGINS = [ APPENGINE_URL, 'https://*.ey.r.appspot.com', # Django 4.0+原生支持该通配格式,覆盖所有版本域名的HTTPS源 'https://my-personal-domain.com' ] # 识别GAE反向代理传递的HTTPS标识,避免重定向死循环 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') SECURE_SSL_REDIRECT = True else: ALLOWED_HOSTS = ["*"]
补充说明
- 如果你使用的Django版本低于4.0,
CSRF_TRUSTED_ORIGINS暂不支持*通配符,可以通过读取GAE内置的版本、服务环境变量动态拼接允许源列表,更简单的方案是直接升级Django到稳定新版本。 - 如果后续切换GAE部署区域,只需要把配置里的
ey.r.appspot.com替换为对应区域的appspot域名后缀即可。
内容的提问来源于stack exchange,提问作者Basley
相关产品推荐
相关产品推荐

