Azure部署Django应用自定义域名登录触发CSRF错误排查
核心问题分析
错误提示明确显示Origin checking failed - https://www.i-heart-java.com does not match any trusted origins,但你已在配置中添加对应域名,大概率是以下两个配置问题导致:
1. ALLOWED_HOSTS格式不符合Django要求
ALLOWED_HOSTS用于验证请求的主机名,不需要包含http:///https://协议前缀,也不能带末尾斜杠。你当前配置里的'https://i-heart-java.com/'、'https://www.i-heart-java.com/'都是无效格式,Django无法正确匹配。
2. 未配置Azure反向代理的信任头
Azure App Service作为反向代理,会将真实请求的协议、主机名通过X-Forwarded-Proto、X-Forwarded-Host头传递给Django,但Django默认不信任这些头,导致它识别到的请求Origin或协议与实际不符,进而触发CSRF验证失败。
修复步骤
第一步:修正ALLOWED_HOSTS格式
将ALLOWED_HOSTS中的所有带协议和斜杠的项改为纯主机名:
ALLOWED_HOSTS = [ '127.0.0.1', 'i-heart-java-XXX.eastus-0X.azurewebsites.net', 'i-heart-java.com', 'www.i-heart-java.com', # 其他合法主机名... ]
第二步:添加Azure代理头信任配置
在settings.py中添加以下配置,让Django信任Azure的反向代理头:
# 信任Azure的X-Forwarded-Proto头,识别真实请求协议(http/https) SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 启用X-Forwarded-Host头,获取真实的主机名 USE_X_FORWARDED_HOST = True
第三步:验证CSRF_TRUSTED_ORIGINS配置
确保CSRF_TRUSTED_ORIGINS中的域名格式正确(带协议,无末尾斜杠),你的当前配置是正确的,可再检查拼写:
CSRF_TRUSTED_ORIGINS = [ "https://i-heart-java.com", "http://i-heart-java.com", "https://www.i-heart-java.com", "http://www.i-heart-java.com", # 其他可信源... ]
第四步:调整SSL相关配置(可选)
既然已启用SESSION_COOKIE_SECURE和CSRF_COOKIE_SECURE,建议将SECURE_SSL_REDIRECT设为True,强制所有请求跳转至HTTPS,避免混合内容问题:
SECURE_SSL_REDIRECT = True
关于DNS的疑问
从错误信息和配置来看,DNS设置应该没有问题——因为你已经能访问自定义域名,只是登录时触发CSRF错误。如果DNS有问题,你根本无法通过自定义域名打开站点。
内容的提问来源于stack exchange,提问作者Dan M.

