我正在从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;
}