Redirect non-www requests to www URLs in Ruby on Rails

前端 未结 7 1959
無奈伤痛
無奈伤痛 2020-12-01 09:52

It is a simple issue, but I can\'t seem to find an answer doing some quick googling.

What\'s the Ruby on Rails way of doing this 301 direct (http://x.com/abc > http:

相关标签:
7条回答
  • 2020-12-01 10:20

    Ideally you'd do this in your web server (Apache, nginx etc.) configuation so that the request doesn't even touch Rails at all.

    Add the following before_filter to your ApplicationController:

    class ApplicationController < ActionController::Base
      before_filter :add_www_subdomain
    
      private
      def add_www_subdomain
        unless /^www/.match(request.host)
          redirect_to("#{request.protocol}x.com#{request.request_uri}",
                      :status => 301)
        end
      end
    end
    

    If you did want to do the redirect using Apache, you could use this:

    RewriteEngine on
    RewriteCond %{HTTP_HOST} !^www\.x\.com [NC]
    RewriteRule ^(.*)$ http://www.x.com/$1 [R=301,L]
    
    0 讨论(0)
  • 2020-12-01 10:22

    You can try the below code -

    location / {
      if ($http_host ~* "^example.com"){
        rewrite ^(.*)$ http://www.example.com$1 redirect;
      }
    }
    
    0 讨论(0)
  • 2020-12-01 10:34

    While John's answer is perfectly fine, if you are using Rails >= 2.3 I would suggest to create a new Metal. Rails Metals are more efficient and they offers better performance.

    $ ruby script/generate metal NotWwwToWww
    

    Then open the file and paste the following code.

    # Allow the metal piece to run in isolation
    require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails)
    
    class NotWwwToWww
      def self.call(env)
        if env["HTTP_HOST"] != 'www.example.org'
          [301, {"Content-Type" => "text/html", "Location" => "www.#{env["HTTP_HOST"]}"}, ["Redirecting..."]]
        else
          [404, {"Content-Type" => "text/html"}, ["Not Found"]]
        end
      end
    end
    

    Of course, you can customize further the Metal.

    If you want to use Apache, here's a few configurations.

    0 讨论(0)
  • 2020-12-01 10:35

    I found this article when trying to achieve the opposite (www to root domain redirection). So I wrote the piece of code that redirects all pages from www to the root domain.

    0 讨论(0)
  • 2020-12-01 10:36

    For rails 4, use it -

      before_filter :add_www_subdomain
    
      private
      def add_www_subdomain
        unless /^www/.match(request.host)
          redirect_to("#{request.protocol}www.#{request.host_with_port}",status: 301)
        end
      end
    
    0 讨论(0)
  • 2020-12-01 10:40

    An alternative solution might be to use the rack-canonical-host gem, which has a lot of additional flexibility. Adding a line to config.ru:

    use Rack::CanonicalHost, 'www.example.com', if: 'example.com'
    

    will redirect to www.example.com only if the host matches example.com. Lots of other examples in the github README.

    0 讨论(0)
提交回复
热议问题