为何裸域https://dinpodcast.com无法跳转至www子域名?
问题分析与解决办法
你的推测是正确的:当访问https://dinpodcast.com时,浏览器会先尝试建立SSL加密连接,此时请求先到达GoDaddy的转发服务器,但该服务器没有配置对应dinpodcast.com的SSL证书,浏览器直接触发安全错误,根本没机会执行跳转逻辑。
无需购买GoDaddy SSL证书的解决办法
核心思路是让裸域的HTTPS请求直接指向Heroku(而非通过GoDaddy转发),利用Heroku的ACM自动生成证书,再通过Django完成跳转:
取消GoDaddy的域名转发设置
先删掉GoDaddy里针对裸域的转发规则,避免后续配置冲突。在Heroku添加裸域配置
用Heroku CLI执行命令:heroku domains:add dinpodcast.com --app 你的应用名称执行后会得到一个类似
xxx.herokudns.com的DNS目标地址。在GoDaddy配置裸域的DNS记录
- 如果GoDaddy支持ALIAS/ANAME记录(别名记录),直接为
dinpodcast.com添加ALIAS记录,指向步骤2得到的Heroku DNS目标; - 如果不支持ALIAS/ANAME,就添加A记录,指向Heroku提供的IP地址(可通过
dig xxx.herokudns.com获取,但ALIAS更稳定,因为Heroku IP可能变更)。
- 如果GoDaddy支持ALIAS/ANAME记录(别名记录),直接为
等待Heroku ACM生成裸域证书
Heroku的ACM会自动检测新增的域名,一般几分钟到几小时内会生成并部署对应dinpodcast.com的SSL证书,你可以通过heroku certs命令查看状态。在Django中配置强制HTTPS和域名跳转
- 在
settings.py中设置:SECURE_SSL_REDIRECT = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') ALLOWED_HOSTS = ['dinpodcast.com', 'www.dinpodcast.com', 'dinpodcast.herokuapp.com'] - 实现裸域跳转到www子域名,可在Django的根
urls.py中添加重定向规则:from django.http import HttpResponsePermanentRedirect from django.conf import settings def redirect_to_www(request): return HttpResponsePermanentRedirect(f'https://www.dinpodcast.com{request.path}') urlpatterns = [ # 你的其他路由配置 ] # 仅在生产环境启用跳转 if not settings.DEBUG: urlpatterns.insert(0, path('', redirect_to_www))
- 在
配置完成后,访问https://dinpodcast.com时,会先通过Heroku的SSL证书建立安全连接,再由Django永久跳转到https://www.dinpodcast.com,彻底解决浏览器报错问题。
内容的提问来源于stack exchange,提问作者YangTegap
相关产品推荐
相关产品推荐

