Перенаправлять не-www запросы на www-URL в Rails - PullRequest
10 голосов
/ 10 ноября 2009

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

Ответы [ 6 ]

18 голосов
/ 10 ноября 2009

В идеале вы должны сделать это в конфигурации вашего веб-сервера (Apache, nginx и т. Д.), Чтобы запрос вообще не касался Rails.

Добавьте следующее before_filter к вашему 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

Если вы хотите выполнить перенаправление с помощью Apache, вы можете использовать это:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.x\.com [NC]
RewriteRule ^(.*)$ http://www.x.com/$1 [R=301,L]
8 голосов
/ 26 марта 2015

Для рельсов 4, используйте его -

  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
7 голосов
/ 10 ноября 2009

Хотя ответ Джона в порядке, если вы используете 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

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

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

3 голосов
/ 11 июня 2013

Существует лучший способ Rails 3 - поместите это в файл routes.rb:

  constraints(:host => "example.com") do
    # Won't match root path without brackets around "*x". (using Rails 3.0.3)
    match "(*x)" => redirect { |params, request|
      URI.parse(request.url).tap { |x| x.host = "www.example.com" }.to_s
    }
  end

Обновление

Вот как сделать его независимым от домена:

  constraints(subdomain: '') do
    match "(*x)" => redirect do |params, request|
      URI.parse(request.url).tap { |x| x.host = "www.#{x.host}" }.to_s
    end
  end
0 голосов
/ 19 июня 2015

Вы можете попробовать следующий код -

location / {
  if ($http_host ~* "^example.com"){
    rewrite ^(.*)$ http://www.example.com$1 redirect;
  }
}
0 голосов
/ 30 июля 2010

Я нашел эту статью, когда пытался добиться обратного (перенаправление www на корневой домен). Поэтому я написал фрагмент кода, который перенаправляет все страницы с www в корневой домен .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...