自定义域名访问Django Azure Web App报400错误求助
Django Azure Web App自定义域名访问400错误排查方案
当前情况
- 已将Django部署到Azure Web App,绑定了GoDaddy购买的自定义域名和Azure提供的SSL证书
- 通过Azure默认域名可正常访问,但自定义域名访问时返回400 Bad Request错误
- 已完成的操作:
- 将默认域名和自定义域名添加至
CSRF_TRUSTED_ORIGINS与ALLOWED_HOSTS列表 - 在Azure Web App配置中开启了HTTP转HTTPS
- 在GoDaddy添加了指向服务器公网IP的A记录和域名验证用的TXT记录
- 尝试过settings.py中的HTTPS配置,但问题仍未解决
- 将默认域名和自定义域名添加至
具体排查与解决步骤
1. 检查CSRF_TRUSTED_ORIGINS的格式是否正确
- 必须包含完整的协议前缀(
https://),不能只写域名,示例:CSRF_TRUSTED_ORIGINS = [ 'https://your-custom-domain.com', 'https://www.your-custom-domain.com', 'https://your-azure-app.azurewebsites.net' ] - 如果有www子域名,务必单独添加,否则会触发CSRF验证失败导致400错误
2. 确认ALLOWED_HOSTS的配置
- 新手排查可以先临时设置为
ALLOWED_HOSTS = ['*']测试,如果能访问,说明是域名没加全 - 生产环境建议指定具体域名,示例:
ALLOWED_HOSTS = [ 'your-custom-domain.com', 'www.your-custom-domain.com', 'your-azure-app.azurewebsites.net' ]
3. 验证Azure的SSL绑定状态
- 登录Azure门户,进入你的Web App -> 左侧菜单选择「自定义域名」
- 确认自定义域名旁的SSL状态显示「已绑定」,且证书状态为有效
- 如果未绑定,重新绑定Azure提供的SSL证书
4. 确保SECURE_PROXY_SSL_HEADER配置生效
- Azure Web App需要这个配置来识别代理传递的HTTPS协议,你的配置
('HTTP_X_FORWARDED_PROTO', 'https')是正确的 - 可以在Django视图中临时添加代码打印请求头,确认是否能获取到
https:def test_view(request): print(request.META.get('HTTP_X_FORWARDED_PROTO')) return HttpResponse("Test") - 如果打印结果是
https,说明代理头传递正常;如果是http,需要检查Azure的HTTP转HTTPS配置是否正确
5. 清除浏览器缓存和Cookie
- 旧的HTTP缓存或Cookie可能导致验证失败,用浏览器隐私模式访问试试,或者手动清除缓存后再测试
6. 检查GoDaddy的DNS记录是否生效
- 用
nslookup your-custom-domain.com命令(或在线DNS查询工具),确认A记录指向的IP和Azure Web App的公网IP完全一致 - 检查TXT记录的验证字符串是否和Azure提供的完全匹配,确保域名所有权验证通过
7. 逐步开启HTTPS配置排查
- 先将
SECURE_SSL_REDIRECT = True改为False,测试自定义域名是否能正常访问 - 如果能访问,再逐一开启其他HTTPS配置(比如
SESSION_COOKIE_SECURE、CSRF_COOKIE_SECURE等),每次修改后部署测试,找到可能冲突的配置
示例有效settings.py关键配置
# 允许的主机列表 ALLOWED_HOSTS = ['your-custom-domain.com', 'www.your-custom-domain.com', 'your-azure-app.azurewebsites.net'] # CSRF信任的源(必须带https://) CSRF_TRUSTED_ORIGINS = ['https://your-custom-domain.com', 'https://www.your-custom-domain.com', 'https://your-azure-app.azurewebsites.net'] # Azure代理SSL头配置 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # HTTPS安全配置(测试正常后开启) SECURE_SSL_REDIRECT = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True SECURE_BROWSER_XSS_FILTER = True SECURE_CONTENT_TYPE_NOSNIFF = True X_FRAME_OPTIONS = 'DENY' SECURE_HSTS_SECONDS = 31536000 SECURE_HSTS_INCLUDE_SUBDOMAINS = True SECURE_HSTS_PRELOAD = True
内容的提问来源于stack exchange,提问作者user27812995
相关产品推荐
相关产品推荐

