Перенаправить запросы, не связанные с WWW, на www-адреса в Rails

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

В идеале вы бы сделали это в настройках своего веб-сервера (Apache, nginx и т. Д.), Чтобы запрос даже не касался Rails.

Добавьте в свой ApplicationController следующий before_filter :

 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 

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

 RewriteEngine on RewriteCond %{HTTP_HOST} !^www\.x\.com [NC] RewriteRule ^(.*)$ http://www.x.com/$1 [R=301,L] 

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

Для рельсов 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 

Есть лучший способ 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 

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

Вы можете попробовать приведенный ниже код –

 location / { if ($http_host ~* "^example.com"){ rewrite ^(.*)$ http://www.example.com$1 redirect; } } 
  • Rails активная запись запросов к ассоциации с 'существует'
  • переменная экземпляра против символа в rubyе на рельсах (form_for)
  • Переадресовывают ли redirect_to и обмениваются?
  • Rails 4 link_to Destroy не работает в учебном руководстве по началу работы
  • Переполнение печенья в рельсах?
  • Отношение «многие ко многим» с той же моделью в рельсах?
  • Конвертировать приложение Ruby on Rails из sqlite в MySQL?
  • Доступ к current_user в модели
  • Как настроить Ruby on Rails без базы данных?
  • Полностью настраиваемое сообщение об ошибке проверки с Rails
  • ActionController :: InvalidAuthenticityToken
  • Давайте будем гением компьютера.