You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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配置:

  1. 登录Namecheap,找到你的域名进入「Advanced DNS」页面
  2. 删掉所有针对裸域(主机记录为@)的A记录,这些静态IP会导致Heroku SSL失效
  3. 添加一条ANAME记录
    • 主机记录:@
    • 记录值:你的Heroku应用域名(比如yourapp.herokuapp.com
    • TTL选Automatic就行
  4. 确认Heroku侧的SSL配置:
    • 用Heroku CLI运行 heroku certs:auto:enable(如果你用的是Heroku提供的自动SSL证书),或者手动上传证书后执行 heroku certs:add
    • heroku domains 确认domain.com已经被添加到你的Heroku应用域名列表里

第二步:让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.comwww.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

火山引擎 最新活动