Rails应用在Nginx+Passenger部署下子URI路径重复问题排查
解决Rails+Passenger+Nginx部署路径重复问题
问题根源
表单提交时URL出现/my-app/view/my-app/view/重复,是因为Rails未感知自身运行在/my-app/view子路径下,生成的路由URL未包含Passenger的基础URI前缀,而Nginx代理配置又叠加了该前缀,最终导致路径重复。
解决方案
方案1:配置Rails相对URL根(推荐)
修改Rails应用的环境配置文件(生产环境对应config/environments/production.rb,开发环境对应config/environments/development.rb),添加以下配置:
config.action_controller.relative_url_root = '/my-app/view'
重启Passenger应用后,Rails生成的所有路由(包括表单提交路径)都会自动带上/my-app/view前缀,与Nginx代理配置匹配,不会再出现重复。
方案2:修改表单路径生成逻辑
若不想修改全局配置,可直接在表单模板中指定正确路径:
=form_tag( explore_new_path, {method: :get, enforce_utf8: false, only_path: false} ) do
注:explore_new_path是Rails路由自动生成的路径辅助方法,若旧版本Rails不支持,也可手动拼接路径(不推荐,硬编码不利于维护):
=form_tag( '/my-app/view/explore/new', {method: :get, enforce_utf8: false} ) do
验证Nginx配置
当前Nginx配置逻辑正确,只需确认passenger_base_uri值与部署路径一致即可:
location ~ ^/my-app/view(/.*|$) { alias /var/www/html/code/public$1; passenger_base_uri /my-app/view; passenger_app_root /var/www/html/code; passenger_document_root /var/www/html/code/public; passenger_enabled on; }
内容的提问来源于stack exchange,提问作者Mark Small
相关产品推荐
相关产品推荐

