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/时:
- 路由匹配到子域名规则,触发
application#blog方法,重定向到https://www.botletter.com/blog/invite-team-members/ - 主域名收到请求后,通过
Rack::ReverseProxy转发到https://blog.botletter.com/invite-team-members/,但因为之前preserve_host: true,转发请求的Host头是www.botletter.com - 你的子域名博客无法识别这个陌生Host,返回错误响应,导致主域名的Rails应用返回500状态码
完成以上修改后重新部署到Heroku,应该就能解决文章URL的重定向问题了。如果还有异常,可以查看子域名博客的访问日志,确认是否收到了Host为blog.botletter.com的请求,进一步验证问题。
内容的提问来源于stack exchange,提问作者nico_lrx
相关产品推荐
相关产品推荐

