想用 nginx 根据 url 前缀转发请求到 rails,所以需要给 rails 加上一个全局的 url 前缀。
试过修改 config.ru 文件为:
map '/app' do
run Rails.application
end
但是这种方法也只是给 controller 的 url 加上了前缀,静态资源没有变化。
补充=========================
在官网上找到了这个配置,但是感觉 rails 在这个地方处理的特别矛盾。
config.relative_url_root = "/app"
这个配置会在生成链接的时候给链接加上前缀,但这个配置有两个问题:
1、只会改变静态文件的链接,controller 的链接不受影响。
2、只是修改生成到网页的链接,而不会修改实际路径。
<%= link_to image_tag("rails.png", alt: "Rails logo"), 'http://rubyonrails.org/' %>
上面的代码本来生成的链接是这样的: http://localhost/rails-b8442a7b798faf40f6c42e065d211574e1bb622495453893e625a416404177c2.png
加了配置后会变成:http://localhost/app/rails-b8442a7b798faf40f6c42e065d211574e1bb622495453893e625a416404177c2.png
但是这个只是改变了生成的 url,并不会改变实际的 url,如果真的需要拿到资源还是需要访问把 app 去掉的 url。
我想这应该是为了给 nginx 用的,由 nginx 在处理时去掉 app 前缀。
这样子和最开始的那个修改 config.ru 的方法加在一起后确实勉强能实现了,需要 nginx 配置两个转发规则一个给 controller,直接原样转发,只是改一下域名和端口;一个给静态文件,转发时去掉 app 前缀。虽然这又会导致不通过 nginx 直接访问系统时无法获取静态资源。。。
虽然这样是能解决问题,但是看着就 tm 的离谱,照理来说第一个方法就因该解决问题了,明明静态资源也是 rails 处理的。从来没在其他语言的 web 框架里见过这种事情。不知道大佬们有没有更好的方案。