如何将www请求重定向至非www域名?Django(Heroku+Dnsimple)配置求助
嘿,我来帮你搞定这个域名统一重定向的问题!结合你用的Heroku、Django和Dnsimple环境,咱们一步步调整配置,确保所有访问都乖乖跳转到https://example.com:
一、Dnsimple 端的正确重定向配置
你之前尝试删除CNAME用URL重定向没成功,大概率是参数设置不到位。按下面的步骤来:
- 先删掉原来的
CNAME www.example.com example.com.herokudns.com记录 - 添加一条URL Redirect记录:
- 主机名填
www - 目标地址填
https://example.com - 重定向类型一定要选301 Permanent(这符合谷歌的SEO规范,告诉搜索引擎这是永久重定向)
- 记得勾选「Forward Path」选项——这样用户访问
www.example.com/about时,会自动跳转到https://example.com/about,不会丢失路径
- 主机名填
- 根域名的ALIAS记录保留不动:
ALIAS example.com example.com.herokudns.com,这是让根域名指向Heroku的核心配置
二、Heroku 端的HTTPS与域名配置
Heroku这边也要同步调整,确保HTTPS强制和域名识别正常:
- 先确认你已经在Heroku添加了两个域名:
example.com和www.example.com。可以用命令heroku domains查看,如果没加www的域名,就执行heroku domains:add www.example.com补上 - 开启Heroku的强制HTTPS:
- 登录Heroku控制台,进入你的应用设置页
- 找到「SSL Certificate」板块,确保已经配置了免费的Let's Encrypt证书(Heroku会自动帮你续期)
- 开启「HTTP Strict Transport Security (HSTS)」和「Force HTTPS」选项
或者用命令行快速设置:heroku config:set FORCE_SSL=true,这会让Heroku自动把所有HTTP请求转成HTTPS
三、Django 端的补充保障
虽然你已经强制启用了HTTPS,但可以加一层配置,确保域名重定向的逻辑完全一致:
- 先检查
settings.py里的基础配置:# 强制HTTPS SECURE_SSL_REDIRECT = True # 开启HSTS,有效期设为1年(符合谷歌规范) SECURE_HSTS_SECONDS = 31536000 SECURE_HSTS_INCLUDE_SUBDOMAINS = True SECURE_HSTS_PRELOAD = True # 允许两个域名访问 ALLOWED_HOSTS = ['example.com', 'www.example.com'] - 如果想让Django直接处理www到非www的重定向(和Dnsimple形成双重保障),可以加个自定义中间件:
在你的Django应用里新建middleware.py文件,写入以下代码:
然后在from django.http import HttpResponsePermanentRedirect class WwwRedirectMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 提取不带端口的主机名 host = request.get_host().split(':')[0] if host.startswith('www.'): # 去掉www前缀,生成新地址 new_host = host[4:] return HttpResponsePermanentRedirect( f'https://{new_host}{request.path}' ) return self.get_response(request)settings.py的MIDDLEWARE列表里,把这个中间件加到CommonMiddleware之前:
这样不管是HTTP还是HTTPS的www请求,都会被Django直接重定向到目标域名,避免中间环节出问题。MIDDLEWARE = [ # 其他中间件... 'your_app_name.middleware.WwwRedirectMiddleware', 'django.middleware.common.CommonMiddleware', # 其他中间件... ]
四、测试与验证
配置完别忘测试,确保所有场景都正常:
- 手动访问
http://example.com、http://www.example.com、https://www.example.com,看是否都跳转到https://example.com - 用curl命令查看重定向细节(更准确):
检查返回的状态码是不是301,目标地址是不是正确的curl -v http://www.example.com curl -v https://www.example.comhttps://example.com - 注意:浏览器会缓存301重定向,如果之前有错误配置,记得清一下浏览器缓存再测试
常见坑点排查
- 如果重定向没生效,先查Dnsimple的记录是否生效:用
nslookup www.example.com,应该返回Dnsimple的重定向服务器地址(而不是Heroku的地址) - 确认Heroku的SSL证书已经生效,域名已经正确添加
- 如果同时用了Heroku的
FORCE_SSL和Django的SECURE_SSL_REDIRECT,可能会出现双重重定向,这时候可以把Django的SECURE_SSL_REDIRECT设为False,让Heroku处理HTTPS转换,Django只负责域名统一
内容的提问来源于stack exchange,提问作者John Rogerson
相关产品推荐
相关产品推荐

