views:

28

answers:

1

Multiple customer instances of an application, under a single application.

What I need is to allow multiple users, to connect to my Apache Web server, by passing different url like : customer1.myhost.com company1.myhost.com company2.myhost.com etc.

What I want my Apache server to do, is pass all request that are not directed to a certain list of existing hosts (like trac.myhost.com and https://myhost.com) over to my Rails application, by setting a RequestHeader to identify the requested host, something like :

RequestHeader "INSTANCE_NAME" = customer1 #for customer1.myhost.com

Thanks for your help!

Ps.: The end goal is to offer software slices as a service, but having all those customers managed under 1 application running. Not 1 app per customer.

+2  A: 

Using a standard VirtualHost configuration you can do this:

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName app.example.com
  ServerAlias *.example.com

  DocumentRoot /web/app.example.com/public
</VirtualHost>

This will capture all requests that are not already captured by other VirtualHost entries.

When your application receives the request, you will have the request variable set with the host-name provided. This is available to any ActionController:

request.host

From there you can load the appropriate data in some kind of before_filter, as is typically done like:

before_filter :load_client

def load_client
  @client = Client.find_by_hostname!(request.host)
rescue ActiveRecord::RecordNotFound
  render(:partial => 'client_not_found', :status => :not_found)
end

So long as the client has the hostname populated correctly, this will find them on each page load.

tadman