Несколько 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