2

我正在从Passenger 迁移到Unicorn,并且使用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/”创建的?

谢谢

4

3 回答 3

4

这是我发现的:

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

ENV['RAILS_RELATIVE_URL_ROOT'] = '/prefix'

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

run Rack::URLMap.new(
  ENV['RAILS_RELATIVE_URL_ROOT'] => Rails.application
)
于 2012-11-24T15:14:17.853 回答
3

我相信在你的 config.ru 中加入这样的东西应该可以做到:

require ::File.expand_path('../config/environment',  __FILE__)

run Rack::URLMap.new(
  "/blah" => Rails.application
)

未经测试

于 2012-04-30T15:40:26.100 回答
1

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

以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;
}
于 2012-11-23T16:33:53.697 回答