# Unable to get the domain in my routes.rb to map custom route

**URL:** <https://www.ruby-forum.com/t/unable-to-get-the-domain-in-my-routes-rb-to-map-custom-route/51374>\
**Category:** Rails\
**Created:** [December 30, 2005, 2:00pm UTC](https://www.ruby-forum.com/t/unable-to-get-the-domain-in-my-routes-rb-to-map-custom-route/51374 "2005-12-30T14:00:59Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![nshb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/df788c/32.png) [@nshb](https://www.ruby-forum.com/u/nshb)\
**Post date:** [December 30, 2005, 2:00pm UTC](https://www.ruby-forum.com/t/unable-to-get-the-domain-in-my-routes-rb-to-map-custom-route/51374/1 "2005-12-30T14:00:59Z")

</div>

I have tried all night trying to find a way to get the host name which  
is  
currently being used within my routes.rb file to do some case/when  
switching  
for specific domains such as this

```
cgi = ActionController::CgiRequest.new(CGI.new)
case cgi.domain(1)
	when /www/
		map.connect '', :controller => 'public', :action =>

```

‘index’  
when /internal/  
map.connect ‘’, :controller =\> ‘admin’, :action =\>  
‘index’  
end

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  
access  
the same @request.domain(1) within my routes.rb as the @request object  
has  
not been loaded yet.

One thought was to use the ENV[‘HTTP\_HOST’] variable, but with my  
current  
LIGHTTPD setup, I do not have this environment variable around.

Any help would be greatly appreciated.

Regards,  
Nathaniel.

```auto
 Nathaniel S. H. Brown http://nshb.net

```

---

<div class="post-metadata">

**Author:** ![nshb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/df788c/32.png) [@nshb](https://www.ruby-forum.com/u/nshb)\
**Post date:** [December 31, 2005, 8:14am UTC](https://www.ruby-forum.com/t/unable-to-get-the-domain-in-my-routes-rb-to-map-custom-route/51374/2 "2005-12-31T08:14:19Z")

</div>

I am still struggling with this. Anyone able to point me in the right  
direction?

-Nb

```auto
 Nathaniel S. H. Brown http://nshb.net

```

---

<div class="post-metadata">

**Author:** ![nshb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/df788c/32.png) [@nshb](https://www.ruby-forum.com/u/nshb)\
**Post date:** [December 31, 2005, 9:05pm UTC](https://www.ruby-forum.com/t/unable-to-get-the-domain-in-my-routes-rb-to-map-custom-route/51374/3 "2005-12-31T21:05:59Z")

</div>

Nathaniel-

```
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?

Cheers-  
-Ezra

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  
> > [http://lists.rubyonrails.org/mailman/listinfo/rails](http://lists.rubyonrails.org/mailman/listinfo/rails)
> 
> * * *
> 
> Rails mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.rubyonrails.org/mailman/listinfo/rails](http://lists.rubyonrails.org/mailman/listinfo/rails)

-Ezra Z.  
WebMaster  
Yakima Herald-Republic Newspaper  
removed\_email\_address@domain.invalid  
509-577-7732

---

<div class="post-metadata">

**Author:** ![nshb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/df788c/32.png) [@nshb](https://www.ruby-forum.com/u/nshb)\
**Post date:** [December 31, 2005, 9:15pm UTC](https://www.ruby-forum.com/t/unable-to-get-the-domain-in-my-routes-rb-to-map-custom-route/51374/4 "2005-12-31T21:15:01Z")

</div>

Hi,

Please look at [http://dev.rubyonrails.org/browser/plugins](http://dev.rubyonrails.org/browser/plugins) and then  
account\_location  
[http://dev.rubyonrails.org/browser/plugins/account\_location](http://dev.rubyonrails.org/browser/plugins/account_location), this is  
something your looking for I think…

---

<div class="post-metadata">

**Author:** ![nshb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/df788c/32.png) [@nshb](https://www.ruby-forum.com/u/nshb)\
**Post date:** [January 1, 2006, 2:27am UTC](https://www.ruby-forum.com/t/unable-to-get-the-domain-in-my-routes-rb-to-map-custom-route/51374/5 "2006-01-01T02:27:37Z")

</div>

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  
map  
it directly to the root URL within the route.

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

-Nb

```auto
 Nathaniel S. H. Brown http://nshb.net

```

---

<div class="post-metadata">

**Author:** ![nshb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/df788c/32.png) [@nshb](https://www.ruby-forum.com/u/nshb)\
**Post date:** [January 1, 2006, 2:24am UTC](https://www.ruby-forum.com/t/unable-to-get-the-domain-in-my-routes-rb-to-map-custom-route/51374/6 "2006-01-01T02:24:37Z")

</div>

I have two domains setup on my rails app:

[example.COM](http://example.COM) and [example.NET](http://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](http://example.NET) to use this route:

if hostname.match(/NET/)  
map.connect ‘’, :controller =\> ‘special’, :action =\> ‘case’  
else  
map.connect ‘’, :controller =\> ‘default’, :action =\> ‘index’  
End

That way I can have a new root URL for [example.NET](http://example.NET), but use the same  
application.

This should definitely be available as it is available through the  
@request.domain(1) within the view. Question is, if its not available in  
a  
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,  
but  
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  
done.

Thanks.  
-Nb

```auto
 Nathaniel S. H. Brown http://nshb.net

```

---

<div class="post-metadata">

**Author:** ![nshb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/df788c/32.png) [@nshb](https://www.ruby-forum.com/u/nshb)\
**Post date:** [January 13, 2006, 11:40pm UTC](https://www.ruby-forum.com/t/unable-to-get-the-domain-in-my-routes-rb-to-map-custom-route/51374/7 "2006-01-13T23:40:27Z")

</div>

Re: problems with Rails routing by hostname, e.g.:

[http://www.verybigsite.com/](http://www.verybigsite.com/) →   
:controller =\> ‘sites’, :action =\> ‘list’  
[http://sanfrancisco.verybigsite.com/](http://sanfrancisco.verybigsite.com/) →   
:controller =\> ‘sites’, :action =\> ‘show’, :id =\> ‘sanfrancisco’  
[http://boston.verybigsite.com/](http://boston.verybigsite.com/) →   
: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  
problem.

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 making…so 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 = ActionController::CgiRequest.new(cgi,  
session\_options), ActionController::CgiResponse.new(cgi)

- 

```
   ENV['REQUEST_HOST']=request.host ## set env variable
   prepare_application
   ActionController::Routing::Routes.recognize!(request).process(request, 

```

response).out(output)  
end  
@@ -66,7 +67,7 @@  
end

```
   def prepare_application

```

- 

```
   ActionController::Routing::Routes.reload if Dependencies.load?

```

- 

```
   ActionController::Routing::Routes.reload ## force reload
   prepare_breakpoint
   Controllers.const_load!(:ApplicationController, "application") 

```

unless Controllers.const\_defined?(:ApplicationController)  
end

And then in config/routes.rb:

hostname=ENV[‘REQUEST\_HOST’]  
if hostname and hostname != ‘[bigsite.com](http://bigsite.com)’ and hostname !=  
‘[www.bigsite.com](http://www.bigsite.com)’  
cityname = hostname.split(‘.’).first  
map.connect ‘’, :controller =\> ‘sites’, :action =\> ‘show’, :id =\>  
cityname  
else  
map.connect ‘’, :controller =\> ‘sites’, :action =\> ‘list’  
end

…it works. Better ideas welcomed!

Andrew
