Несколько robots.txt для поддоменов в рельсах - PullRequest
8 голосов
/ 01 мая 2010

У меня есть сайт с несколькими поддоменами, и я хочу, чтобы названные субдомены robots.txt отличались от www.

Я пытался использовать .htaccess, но FastCGI на это не смотрит.

Итак, я пытался настроить маршруты, но не похоже, что вы не можете выполнить прямую перезапись, поскольку для каждого маршрута нужен контроллер:

map.connect '/robots.txt', :controller => ?, :path => '/robots.www.txt', :conditions => { :subdomain => 'www' }
map.connect '/robots.txt', :controller => ?,  :path => '/robots.club.txt'

Как лучше всего подойти к этой проблеме?

(я использую плагин request_routing для поддоменов)

Ответы [ 5 ]

17 голосов
/ 27 мая 2010

На самом деле, вы, вероятно, хотите установить тип mime в mime_types.rb и сделать это в блоке respond_to, чтобы он не возвращал его как 'text/html':

Mime::Type.register "text/plain", :txt

Тогда ваши маршруты будут выглядеть так:

map.robots '/robots.txt', :controller => 'robots', :action => 'robots'

Для рельсов3:

match '/robots.txt' => 'robots#robots'

и контроллер что-то вроде этого (поместите файл (файлы) в любое удобное для вас место):

class RobotsController < ApplicationController
  def robots
    subdomain = # get subdomain, escape
    robots = File.read(RAILS_ROOT + "/config/robots.#{subdomain}.txt")
    respond_to do |format|
      format.txt { render :text => robots, :layout => false }
    end
  end
end

рискуя перегрузить его, у меня может возникнуть соблазн кэшировать операцию чтения файла ...

Да, вам почти наверняка придется удалить / переместить существующий файл 'public/robots.txt'.

Проницательные читатели заметят, что вы можете легко заменить RAILS_ENV на subdomain ...

10 голосов
/ 14 ноября 2012

Почему бы не использовать рельсы, встроенные в представления?

В вашем контроллере добавьте этот метод:

class StaticPagesController < ApplicationController
  def robots
    render :layout => false, :content_type => "text/plain", :formats => :txt
  end
end

В представлении создайте файл: app/views/static_pages/robots.txt.erb с содержимым robots.txt

В routes.rb месте:

get '/robots.txt' => 'static_pages#robots'

Удалить файл /public/robots.txt

При необходимости вы можете добавить определенную бизнес-логику, но таким образом мы не будем читать никаких пользовательских файлов.

1 голос
/ 12 апреля 2013

для рельсов 3:

Создание контроллера RobotsController:

class RobotsController < ApplicationController
#This controller will render the correct 'robots' view depending on your subdomain.
  def robots
    subdomain = request.subdomain # you should also check for emptyness
    render "robots.#{request.subdomain}"
  end
end

Создание просмотров роботов (1 на поддомен):

  • вид / роботы / robots.subdomain1.txt
  • Вид / роботы / robots.subdomain2.txt
  • и т.д ...

Добавить новый маршрут в config / rout.rb: (обратите внимание: опция формата txt)

match '/robots.txt' => 'robots#robots', :format => :txt

И, конечно, вы должны объявить формат: txt в config / initializers / Mime_types.rb:

Mime::Type.register "text/plain", :txt

Надеюсь, это поможет.

0 голосов
/ 20 декабря 2012

Мне понравилось решение TA Tyree, но оно очень ориентировано на Rails 2.x, так что вот что я придумал для Rail 3.1.x

mime_types.rb

Mime::Type.register "text/plain", :txt

Добавляя формат в маршруты, вам не нужно беспокоиться об использовании блока response_to в контроллере. routes.rb

match '/robots.txt'   => 'robots#robots',   :format => "text"

Я добавил кое-что еще на этот счет. Специалисты по SEO жаловались на дублированный контент как на поддоменах, так и на страницах SSL, поэтому я создал два файла робота, один для производства и один для не производства, который также будет обслуживаться с любыми запросами SSL / HTTPS в работе.

robots_controller.rb

class RobotsController < ApplicationController 
  def robots
     site = request.host
     protocol = request.protocol
     (site.eql?("mysite.com") || site.eql?("www.mysite.com")) && protocol.eql?("http://")  ? domain = "production" : domain = "nonproduction"
     robots = File.read( "#{Rails.root}/config/robots-#{domain}.txt")
     render :text => robots, :layout => false
  end
end
0 голосов
/ 01 мая 2010

Если вы не можете сконфигурировать ваш http-сервер для этого до того, как запрос будет отправлен на rails, я бы просто настроил контроллер 'robots', который отображает шаблон как:

def show_robot
  subdomain = # get subdomain, escape
  render :text => open('robots.#{subdomain}.txt').read, :layout => false
end

В зависимости от того, что вы пытаетесь достичь, вы также можете использовать один шаблон вместо нескольких файлов.

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