You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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:
    1. 登录Heroku控制台,进入你的应用设置页
    2. 找到「SSL Certificate」板块,确保已经配置了免费的Let's Encrypt证书(Heroku会自动帮你续期)
    3. 开启「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之前:
    MIDDLEWARE = [
        # 其他中间件...
        'your_app_name.middleware.WwwRedirectMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 其他中间件...
    ]
    
    这样不管是HTTP还是HTTPS的www请求,都会被Django直接重定向到目标域名,避免中间环节出问题。
四、测试与验证

配置完别忘测试,确保所有场景都正常:

  • 手动访问http://example.com、http://www.example.com、https://www.example.com,看是否都跳转到https://example.com
  • 用curl命令查看重定向细节(更准确):
    curl -v http://www.example.com
    curl -v https://www.example.com
    
    检查返回的状态码是不是301,目标地址是不是正确的https://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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:19:50