Перенаправьте запросы non-www к www URL в направляющих

Простая проблема, но, может казаться, не находит ответ, делающий некоторое быстрое Гугление. Каковы направляющие способ сделать это 301 прямой (http://x.com/abc> http://www.x.com/abc). before_filter?

10
задан Peter Mortensen 29 November 2019 в 18:37
поделиться

2 ответа

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]
18
ответ дан 3 December 2019 в 14:11
поделиться

Хотя ответ Джона прекрасен, если вы используете Rails> = 2.3, я бы предложил создать новый Metal. Rails Metals более эффективны и предлагают лучшую производительность.

$ ruby script/generate metal NotWwwToWww

Затем откройте файл и вставьте следующий код.

# 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

Конечно, вы можете дополнительно настроить Metal.

Если хотите, используйте Apache, вот несколько конфигураций .

7
ответ дан 3 December 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: