Forum: Ruby on Rails Unable to get the domain in my routes.rb to map custom route

Announcement (2017-05-07): is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see and for other Rails- und Ruby-related community platforms.
Nshbrown N. (Guest)
on 2005-12-30 15:00
(Received via mailing list)
I have tried all night trying to find a way to get the host name which
currently being used within my routes.rb file to do some case/when
for specific domains such as this

	cgi =
	case cgi.domain(1)
		when /www/
			map.connect '', :controller => 'public', :action =>
		when /internal/
			map.connect '', :controller => 'admin', :action =>

And have had no success. The domain(1) is empty in this case.

I have tried a similar approach in one of my views, using the
@request.domain(1) and that works PERFECT. Yet I have found no way to
the same @request.domain(1) within my routes.rb as the @request object
not been loaded yet.

One thought was to use the ENV['HTTP_HOST'] variable, but with my
LIGHTTPD setup, I do not have this environment variable around.

Any help would be greatly appreciated.


 Nathaniel S. H. Brown                 
Nshbrown N. (Guest)
on 2005-12-31 09:14
(Received via mailing list)
I am still struggling with this. Anyone able to point me in the right


 Nathaniel S. H. Brown                 
Ezra Z. (Guest)
on 2005-12-31 22:05
(Received via mailing list)

	I don't think you are going to be able to do this in routes. I could
be wrong but I dont think the request obje3ct is available to routes
in the way that you want. I think its more likely that you could use
a before filter in application.rb to do a redirect to the correct url
based on the subdomain. But I could be misunderstanding what you are
trying to do. Any more details of what you want to accomplish?


On Dec 30, 2005, at 11:12 PM, Nathaniel S. H. Brown wrote:

>> -----Original Message-----
>> to do some case/when switching for specific domains such as this
>> Rails mailing list
>> removed_email_address@domain.invalid
> _______________________________________________
> Rails mailing list
> removed_email_address@domain.invalid

-Ezra Z.
Yakima Herald-Republic Newspaper
Abdur-Rahman A. (Guest)
on 2005-12-31 22:15
(Received via mailing list)

Please look at and then
<, this is
something your looking for I think...
Nshbrown N. (Guest)
on 2006-01-01 03:24
(Received via mailing list)
I have two domains setup on my rails app:

example.COM and example.NET

I want to be able to have a case in the routes, that if the URL in the
location bar is example.NET to use this route:

if hostname.match(/NET/)
  map.connect '', :controller => 'special', :action => 'case'
  map.connect '', :controller => 'default', :action => 'index'

That way I can have a new root URL for example.NET, but use the same

This should definitely be available as it is available through the
@request.domain(1) within the view. Question is, if its not available in
default variable, how can I populate it manually? I checked out the CGI
module from Ruby, and it mentions to use the ENV['HTTP_HOST'] variable,
that is empty. So I am led to believe that Rails gets the active domain
through some other mechanism, yet I am unable to find where this is


 Nathaniel S. H. Brown                 
Nshbrown N. (Guest)
on 2006-01-01 03:27
(Received via mailing list)
After looking at this, it appears this still doesn't address the
functionality that I want.

I don't want to redirect to a specific controller and action, I want to
it directly to the root URL within the route.

So http://example.NET/ and http://example.ORG/ can use the same Rails
install, yet have two totally different default routes.


 Nathaniel S. H. Brown                 
D Andrew R. (Guest)
on 2006-01-14 00:40
(Received via mailing list)
Re: problems with Rails routing by hostname, e.g.: -->
    :controller => 'sites', :action => 'list' -->
    :controller => 'sites', :action => 'show', :id => 'sanfrancisco' -->
    :controller => 'sites', :action => 'show', :id => 'boston'

I really wanted to make this work in routing, not in URL rewriting,
before_filters, etc.  Here's my understanding of the problem, and
my simple but kludgy solution (suggestions welcomed!).

(running current versions of lighttpd, fastcgi, and rails)

First of all, lighttpd doesn't seem to pass the useful bits of the
HTTP request header in environment variables.  Or perhaps FastCGI
doesn't forward them along to Rails.  This might be a configuration

Anyway, Rails builds the route map at startup, and (in development
mode ONLY) before each request.  The CGI request is fully parsed
before the route is followed, but since routes are not normally
reloaded for each request, there would be no value in passing the
request data for routing decision it isn't.

So we have to do two things:
  - Store the request data somewhere persistent (or pass it to
    the routing code)
  - Reload the routes for each request

Depending on your circumstances, this might cause an unacceptable
performance hit.  My routes are lightweight, so I decided to give
it a spin.  Very limited testing suggests that reloading routes
is not a big deal at all.

Here's what I did...

A couple of small changes to dispatcher.rb (my RubyGems install
puts it in /usr/local/lib/ruby/gems/1.8/gems/rails-1.0.0/lib):

--- dispatcher.rb-orig	Fri Jan 13 16:37:42 2006
+++ dispatcher.rb	Fri Jan 13 16:38:29 2006
@@ -34,6 +34,7 @@
     def dispatch(cgi = nil, session_options =
ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, output = $stdout)
       if cgi ||= new_cgi(output)
         request, response =,
+        ENV['REQUEST_HOST'] ## set env variable
@@ -66,7 +67,7 @@

       def prepare_application
-        ActionController::Routing::Routes.reload if Dependencies.load?
+        ActionController::Routing::Routes.reload ## force reload
         Controllers.const_load!(:ApplicationController, "application")
unless Controllers.const_defined?(:ApplicationController)

And then in config/routes.rb:

if hostname and hostname != '' and hostname !=
  cityname = hostname.split('.').first
  map.connect '', :controller => 'sites', :action => 'show', :id =>
  map.connect '', :controller => 'sites', :action => 'list'
end works.  Better ideas welcomed!

This topic is locked and can not be replied to.