19

I think this should be fairly easy but I'm not familiar with how it's done...

How do you write a before filter that would check if the current request is for certain subdomains, and if so redirect it to the same url but on a different subdomain?

Ie: blog.myapp.com/posts/1 is fine but blog.myapp.com/products/123 redirects to www.myapp.com/products/123.

I was thinking something like...

class ApplicationController < ActionController::Base
  before_filter :ensure_domain

  protected
  def ensure_domain
    if request.subdomain == 'blog' && controller_name != 'posts'
      redirect_to # the same url but at the 'www' subdomain...
    end
  end
end

How do you write that redirect?

Andrew
  • 42,517
  • 51
  • 181
  • 281

4 Answers4

16

ActionController::Redirecting#redirect_to allows you to pass an absolute URL, so the easiest thing to do would be to pass it one with something like:

redirect_to request.url.sub('blog', 'www')
Jan Klimo
  • 4,643
  • 2
  • 36
  • 42
Todd A. Jacobs
  • 81,402
  • 15
  • 141
  • 199
  • 7
    Doh! The sub method is just the plain old ruby sub method... ok so after further experimentation this works but I have to use more of a regex to take care of it. The `request.url` object gives me enough to figure out the rest though, thanks! – Andrew May 15 '12 at 20:22
7

A simple choice to redirect from subdomain to subdomain would be the following

redirect_to subdomain: 'www', :controller => 'www', :action => "index"

This would be called on a domain name for example foo.apple.com would then go to www.apple.com

Rick
  • 12,606
  • 2
  • 43
  • 41
2

An even simpler option without the need to do a string sub or specify the controller or action would be to use

redirect_to url_for(subdomain: 'www', only_path: false)
Tim Krins
  • 3,134
  • 1
  • 23
  • 25
1

A simple solution for this is

redirect_to dummy_rul(subdomain: 'subdomain')

Example:

redirect_to projects_url(subdomain: 'edv') it will redirect on below url

"http://edv.maindomain.com/projects"

"edv" is my subdomain

Gaurav Patil
  • 1,162
  • 10
  • 20