Redirect 'myapp.com' to 'www.myapp.com' in rails without using htaccess?

筅森魡賤 提交于 2019-11-29 21:31:24

Maybe something like this would do the trick:

class ApplicationController < ActionController::Base
  before_filter :check_uri

  def check_uri
    redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host)
  end
end

Carson's answer works great.

Here's the code to go the other way (www -> no www)

before_filter :check_uri

def check_uri
  if /^www/.match(request.host)
    redirect_to request.protocol + request.host_with_port[4..-1] + request.request_uri 
  end
end

I had to change Carson's answer to get this to work in Rails 3. I replaced request.uri with request.fullpath:

class ApplicationController < ActionController::Base
  protect_from_forgery

  Rails.env.production? do
    before_filter :check_url
  end

  def check_url
    redirect_to request.protocol + "www." + request.host_with_port + request.fullpath if !/^www/.match(request.host)
  end
end

This worked great for me. I did make one small addition as I only wanted this behavior in my production environment:

def check_uri
  redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host) if Rails.env == 'production'
end

I know this is answered, but I thought everyone else should know about the CodeRack: Canonical Host solution. This is really nice as it allows for env specific redirects. http://coderack.org/users/tylerhunt/middlewares/6-canonical-host

Here is a couple of different ways:

 head :moved_permanently, :location => ‘http://www.newdomain.com’

another:

def rails_301
headers["Status"] = "301 Moved Permanently"
redirect_to "http://www.newdomain.com"
end 
Rodrigo Garcia Najera

For those of you who are looking to also force SSL using heroku, this worked well for me, based on Heroku SSL on root domain

In my DNS settings I set up a URL / Forward record (DNS Simple)

URL foo.com     3600        http://www.foo.com

The CNAME setup only needs to be setup for WWW

CNAME   www.foo.com 3600        providedssslendpoint.herokussl.com

I also had to setup and Alias for my root

ALIAS   foo.com 3600        providedsslendpoint.herokussl.com

Then I decided to simply replace foo.com with an env variable ENV['SITE_HOST'] (where SITE_HOST might equal www.foo.com or test.foo.com) so I can have control via my heroku configuration. That way, I can control what happens in different environments. (for setting up env variables locally see https://github.com/bkeepers/dotenv)

For example, my test app uses test.foo.com as the url it also has its own SSL endpoint so that works fine for me.

  before_filter :check_domain

  def check_domain
    if Rails.env.production? || Rails.env.testing? and request.host.downcase != ENV['SITE_HOST']
      redirect_to request.protocol + ENV['SITE_HOST'] + request.fullpath, :status => 301
    end
  end

From now on, end users will always access www with forced SSL. Old links will suffer a small hang but nothing noticeable.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!