如何让独角兽在路径下运行 Rails 3.0 应用程序



我正在从Passenger 迁移到独角兽,对于Passenger ,我曾经使用RailsBaseURI选项运行我的Rails 3.0应用程序,例如在所有URL前面加上"/blah"。

在 Unicorn 下运行相同的应用程序时,我将"--path/blah"传递给unicorn_rails,但服务器仍然以 http://server:3000/etc/etc 而不是 http://server:3000/blah/etc/etc 的形式提供服务 - 我看到一些资产是通过/blah/请求的(如 JS 文件等),但各种链接之前仍然没有"/blah/"。

所以 - 总结一下 - 我如何让 Unicorn 在/blah 下挂载我的应用程序,以便所有请求都使用路径前面的"/blah",并且所有链接和资产都以"/blah/"作为前缀创建?

谢谢

以下是我的发现:

要让 Rails 应用程序提供资产和链接 URL,您必须在启动之前设置一个环境变量:

ENV['RAILS_RELATIVE_URL_ROOT'] = '/prefix'

然后,正如@d11wtq所说,要让机架兼容服务器(在本例中为 Unicorn)以前缀实际提供应用程序,您必须在 config.ru 文件中执行以下操作,而不是通常的运行行:

run Rack::URLMap.new(
  ENV['RAILS_RELATIVE_URL_ROOT'] => Rails.application
)
我相信

在你的 config.ru 里放这样的东西应该可以做到:

require ::File.expand_path('../config/environment',  __FILE__)
run Rack::URLMap.new(
  "/blah" => Rails.application
)

未经测试

简单可靠的解决方案是在前端设置中设置前缀。

以 passenger+nginx 为例,您可以使用这样的东西:

server {
    listen 80;
    server_name www.phusion.nl;
    root /websites/phusion;
    passenger_enabled on;
    passenger_base_uri /prefix;
}

源代码中没有什么可更改的,一行设置。


但是你说你正在使用unicorn,你使用的是哪个前端?

使用nginx应该是可以通过这样的东西来实现的:

location /prefix {
    rewrite           ^/prefix/(.*)  /$1      break;
    proxy_pass        http://localhost:8000;
}

最新更新