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

Heroku Rails应用中博客文章URL重定向至目录失效求助

解决子域名博客重定向到主域名/blog/路径下文章URL 500错误的问题

看起来你的核心问题出在反向代理的Host头设置以及部分冗余的重定向逻辑上,我们一步步来修复:

1. 修正Rack反向代理的Host头配置

你的config.ru里设置了:preserve_host => true,这会导致主域名的/blog/*请求转发到子域名时,请求的Host头还是www.botletter.com,而你的子域名博客(比如WordPress或其他系统)只会识别blog.botletter.com这个Host,因此无法正确解析请求,最终返回500错误。

修改config.ru,将:preserve_host改为false,同时调整正则匹配规则覆盖/blog和/blog/xxx两种格式:

require_relative 'config/environment'
use Rack::ReverseProxy do
  reverse_proxy /^\/blog(\/.*)?$/, 'https://blog.botletter.com$1', :timeout => 500, :preserve_host => false
end
run Rails.application

2. 简化路由配置

你原来的get '/blog' => redirect(...)可以简化为直接重定向到带斜杠的路径,避免路由匹配歧义:

# 处理主域名/blog → /blog/的跳转,保证反向代理能正确匹配
get '/blog', to: redirect('/blog/')
# 子域名所有请求统一重定向到主域名的/blog/路径下
get '(*path)', to: 'application#blog', constraints: { subdomain: 'blog' }

3. 优化控制器的重定向逻辑

原来的gsub('/blog','')是冗余的——子域名的请求路径里本身就没有/blog前缀,直接拼接即可:

def blog
  redirect_to "https://www.botletter.com/blog#{request.fullpath}", status: :moved_permanently
end

问题根源复盘

当用户访问blog.botletter.com/invite-team-members/时:

  1. 路由匹配到子域名规则,触发application#blog方法,重定向到https://www.botletter.com/blog/invite-team-members/
  2. 主域名收到请求后,通过Rack::ReverseProxy转发到https://blog.botletter.com/invite-team-members/,但因为之前preserve_host: true,转发请求的Host头是www.botletter.com
  3. 你的子域名博客无法识别这个陌生Host,返回错误响应,导致主域名的Rails应用返回500状态码

完成以上修改后重新部署到Heroku,应该就能解决文章URL的重定向问题了。如果还有异常,可以查看子域名博客的访问日志,确认是否收到了Host为blog.botletter.com的请求,进一步验证问题。

内容的提问来源于stack exchange,提问作者nico_lrx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:58:38