Sometimes you need to run your Rails (3) Application on a Sub-URI (e.g. examle.com/prod, example.com/dev). In my current Project there was a Problem with that Configuration and the Rails url-helpers (link_for, url_for, usw.) becourse the app wasn’t aware of the necessary prefix (in our example “/dev”, “/prod”).
There is always the possibility to set the apps basic URL within your app-Context. Together with setting the prefix in a System Enviroment it was possible to achieve the wanted app behaviour.
How to configure a Rails3 App with Passenger in a Sub-URI Configuration please have a look in the Phusion Passenger users guide here or in another blog post here.
The Basic Apache Configuration looks somehow like this:
<VirtualHost *:80>
ServerName example.com
ServerAdmin admin@example.com
DocumentRoot /var/www
# we added two file hardlinks from our apps public folder to /var/www/dev, /var/www/prod
<Directory /var/www/prod>
...
SetEnv RAILS_RELATIVE_URL_ROOT /prod
...
</Directory>
<Directory /var/www/dev>
...
SetEnv RAILS_RELATIVE_URL_ROOT /dev
...
</Directory>
</VirtualHost>
The last part is to add a Before-Hook to the ApplicationController for updating the apps default_url if RAILS_RELATIVE_URL_ROOT is set:
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :action_set_url_options
def action_set_url_options
if ENV['RAILS_RELATIVE_URL_ROOT']
@host = request.host+":"+request.port.to_s+"/"+ENV['RAILS_RELATIVE_URL_ROOT']
else
@host = request.host+":"+request.port.to_s
end
Rails.application.routes.default_url_options = { :host => @host}
end
end