Несколько robots.txt для поддоменов в рельсах

У меня есть сайт с несколькими поддоменами, и я хочу, чтобы именованные субдомены 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 ответов

Решение

На самом деле, вы, вероятно, хотите установить 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...

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

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

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

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

Начиная с Rails 6.0 это было значительно упрощено.

По умолчанию, если вы используете параметр:plain, текст отображается без использования текущего макета. Если вы хотите, чтобы Rails поместил текст в текущий макет, вам нужно добавить параметр layout: true и использовать расширение.text.erb для файла макета. Источник

class RobotsController < ApplicationController 
  def robots
    subdomain = request.subdomain # Whatever logic you need
    robots = File.read( "#{Rails.root}/config/robots.#{subdomain}.txt")
    render plain: robots
  end
end

В routes.rb

get '/robots.txt', to: 'robots#robots'

Для Rails 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 format)

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

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

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

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

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

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

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

Мне понравилось решение 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
Другие вопросы по тегам