Heroku+Namecheap环境下HTTPS访问及域名重定向配置咨询
解决Heroku + Namecheap下的域名HTTPS访问与重定向问题
看起来你在Heroku+Namecheap的域名配置上遇到了几个典型的SSL和重定向问题,我来一步步帮你梳理解决:
先明确下你当前的状态:
http://domain.com能自动跳转到HTTPS,但https://domain.com直接访问不行www.domain.com只能走未加密的HTTP,既没有HTTPS支持,也不会重定向到加密链接
下面分两大步来搞定:先修复裸域的HTTPS访问,再配置www子域的加密与重定向。
第一步:让https://domain.com正常访问
Heroku的SSL配置对裸域(不带www的主域名)有特殊要求——它不支持静态IP的A记录,必须用ANAME别名记录(Namecheap原生支持)或者CNAME来指向你的Heroku应用域名。
在Namecheap后台做DNS配置:
- 登录Namecheap,找到你的域名进入「Advanced DNS」页面
- 删掉所有针对裸域(主机记录为
@)的A记录,这些静态IP会导致Heroku SSL失效 - 添加一条ANAME记录:
- 主机记录:
@ - 记录值:你的Heroku应用域名(比如
yourapp.herokuapp.com) - TTL选
Automatic就行
- 主机记录:
- 确认Heroku侧的SSL配置:
- 用Heroku CLI运行
heroku certs:auto:enable(如果你用的是Heroku提供的自动SSL证书),或者手动上传证书后执行heroku certs:add - 跑
heroku domains确认domain.com已经被添加到你的Heroku应用域名列表里
- 用Heroku CLI运行
第二步:让www.domain.com支持HTTPS并自动重定向
现在要解决www子域的加密问题,同时让它自动跳转到https://domain.com(按你的需求来)。
1. 先给www子域开启HTTPS
在Namecheap的DNS里加一条CNAME记录:
- 主机记录:
www - 记录值:你的Heroku应用域名
- TTL选
Automatic
然后在Heroku里添加这个子域:
heroku domains:add www.domain.com
跑 heroku certs 确认你的SSL证书包含domain.com和www.domain.com两个域名(也就是带SAN扩展的证书,Heroku自动生成的证书默认会包含所有添加的域名)。
2. 配置重定向逻辑
Heroku本身不直接处理域名重定向,得在应用代码里加逻辑,或者用Heroku的插件,但代码层面更灵活可控。
举几个常见框架的例子:
Node.js/Express
在你的中间件里加这段:
app.use((req, res, next) => { // 强制所有请求走HTTPS if (req.headers['x-forwarded-proto'] !== 'https') { return res.redirect(`https://${req.headers.host}${req.url}`); } // 把www开头的域名重定向到裸域 if (req.headers.host.startsWith('www.')) { const newHost = req.headers.host.slice(4); return res.redirect(`https://${newHost}${req.url}`); } next(); });
Ruby on Rails
在config/environments/production.rb里添加:
# 强制所有请求走HTTPS config.force_ssl = true # 配置www到裸域的重定向 Rails.application.config.middleware.insert_before(Rack::Runtime, Rack::Rewrite) do r301 %r{.*}, 'https://domain.com$&', if: Proc.new { |rack_env| rack_env['SERVER_NAME'] == 'www.domain.com' } end
Python/Django
在settings.py里设置:
# 强制HTTPS SECURE_SSL_REDIRECT = True # 配置重定向中间件 MIDDLEWARE = [ # ... 其他中间件 'django.middleware.security.SecurityMiddleware', 'django.contrib.redirects.middleware.RedirectFallbackMiddleware', ] # 在admin后台添加重定向规则:www.domain.com -> https://domain.com
最后验证
等DNS解析生效(一般10-30分钟,有时候更快),测试以下场景:
- 直接访问
https://domain.com:应该正常加载,浏览器地址栏显示安全锁 - 访问
www.domain.com(不管是HTTP还是HTTPS):自动跳转到https://domain.com - 访问
http://domain.com:保持现有自动跳转HTTPS的行为
内容的提问来源于stack exchange,提问作者tria




