如何配置Heroku上的Rails应用(含路由)通过Nginx子目录代理访问
Rails 6.1.x 子路径部署配置验证(Heroku)
你的配置方向基本正确,但存在一些可以优化的细节,避免后续出现路径混乱或资源加载问题,具体分析如下:
当前配置的合理性
- 设置
config.action_controller.relative_url_root = "/exampleapp":这是Rails处理子路径部署的核心配置,能让框架自动生成带前缀的URL,并正确解析请求路径,这一步是正确的。 - 配置
config.assets.prefix = "/exampleapp/assets":确保静态资源的请求路径带上前缀,避免出现资源404的情况,这一步配置正确。 - 路由使用
scope '(:prefix)'包裹:这会让路由同时匹配带前缀和不带前缀的路径,虽然当前能正常访问,但不符合你司要求的“仅通过companydomain.com/exampleapp访问”的初衷,容易引发路径歧义。 - 在
application_controller.rb中定义default_url_options返回{prefix: 'exampleapp'}:确保所有通过Rails辅助方法生成的URL默认带上前缀,这一步配置正确。
关键优化建议
- 调整路由scope为固定前缀:将
scope '(:prefix)'修改为scope '/exampleapp',这样路由只会匹配带前缀的路径,彻底禁用不带前缀的访问方式,符合域名配置要求。 - 确认反向代理头部传递:确保公司域名到Heroku实例的反向代理(如Nginx、CDN或Heroku的域名转发设置)正确传递
X-Forwarded-Prefix头部,Rails依赖该头部准确识别请求的子路径。 - 静态资源与URL生成测试:访问
companydomain.com/exampleapp/assets/application.css验证静态资源加载正常;同时检查页面内所有链接(如登录、导航链接)是否自动带上/exampleapp前缀,避免出现硬编码的无前缀URL。 - 改用环境变量配置前缀:建议在Heroku上设置环境变量
RAILS_RELATIVE_URL_ROOT=/exampleapp,替代配置文件中的硬编码,这样无需修改代码即可调整前缀,更灵活。
额外注意事项
- 确保所有URL生成都使用Rails路由辅助方法(如
link_to、form_with),不要硬写路径,避免出现不带前缀的链接。 - 若使用Devise、ActiveAdmin等第三方Gem,需确保它们的路由也被包含在子路径的
scope中,避免登录、后台管理等路径失效。
内容的提问来源于stack exchange,提问作者Ravi Bhusal
相关产品推荐
相关产品推荐

