2010-05-01 2 views
8

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

Я попытался использовать .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 для субдоменов)

+0

"on" не является тегом. –

ответ

17

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

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

Тогда ваши маршруты будут выглядеть следующим образом:

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

Для rails3:

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 ...

+3

Спасибо за публикацию этого, это вдохновило меня - я немного упростил эту технику и обновил ее для Rails 3. http://www.timbabwe.com/2011/08/rails-robots-txt-customized-by-environment-automatically/ – tkrajcar

+0

Спасибо, мне понравилось ваше решение. Я опубликовал решение Rails 3.x с небольшими изменениями. –

0

Если вы не можете настроить HTTP-сервер, чтобы сделать это, прежде чем запрос отправляется на рельсы, я бы просто установка контроллера «роботов», который оказывает шаблон как:

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

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

10

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

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

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

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

0

мне понравилось решение TA Тайри, но это очень Rails 2.x Centric, так вот что я придумал для 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 
1

для рельсов 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/robots.subdom ain1.txt
  • просмотров/роботы/robots.subdomain2.txt
  • и т.д ...

Добавить новый маршрут в конфиге/routes.rb: (обратите внимание: текстовый вариант формата)

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

И, конечно, вы должны объявить: текстовый формат в конфигурации/инициализаторах/Mime_types.rb:

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

Надеется, что это помогает.

Смежные вопросы