为什么Django特定路由拒绝HTTP连接但其他路由HTTP访问正常?
问题核心原因排查方向
你遇到的强制HTTPS跳转问题和HSTS、Django安全配置、浏览器缓存三个层面有关,按如下顺序排查即可解决,不需要重建项目:
1. 优先排查Django全局安全配置遗漏
检查settings.py中除了SECURE_HSTS_SECONDS之外的安全配置项:
- 确认
SECURE_SSL_REDIRECT的值是否为True,该配置会直接让Django将所有HTTP请求重定向到HTTPS,是最常见的跳转原因 - 确认是否配置了
SECURE_REDIRECT_EXEMPT,如果该列表里包含了works/路由但未包含projects/,就会出现你描述的不同路由表现不同的情况 - 确认是否引入了
django-sslify、django-secure等强制HTTPS的第三方包,这类包的优先级高于Django原生安全配置
2. 排查是否是浏览器301永久重定向缓存导致
Django默认开启SSL重定向时返回的是301永久重定向,该状态码会被浏览器长期缓存,即便你后续修改了后端配置,浏览器依然会直接跳转HTTPS:
- 直接用curl命令测试后端返回结果,排除浏览器缓存干扰:
如果返回状态码是200,说明后端配置已经生效,问题出在浏览器缓存,清除浏览器全部缓存(包括静态文件、浏览历史、Cookie)或者用无痕模式访问即可curl -v http://localhost:8000/projects/
如果返回301/302跳转到HTTPS,说明问题还是出在后端配置
3. 排查projects应用的单独配置
因为只有projects/前缀的路由出现问题,要检查projects应用内部的配置:
- 检查
projects/urls.py中是否给路由加了@require_https之类的装饰器 - 检查projects应用的views中是否有单独的HTTPS校验逻辑
- 确认项目是否配置了多环境settings,你修改的配置是否和当前运行服务加载的settings是同一个文件,可以在视图中打印对应配置项的值确认生效状态
4. 排查反向代理配置
如果你的服务前部署了Nginx、Caddy等反向代理,确认代理层面是否配置了projects/路径的HTTPS跳转规则,代理层的跳转优先级高于Django本身的配置。
内容的提问来源于stack exchange,提问作者Arseniy Koshelnik
相关产品推荐
相关产品推荐

