2010-05-01 14 views
8

Mam witrynę z wieloma subdomenami i chcę, aby nazwane poddomeny robots.txt różniły się od strony www.Wiele plików robots.txt dla subdomen w szynach

Próbowałem użyć .htaccess, ale FastCGI na to nie patrzy.

Więc starałem się skonfigurować trasy, ale nie wydaje się, że nie można zrobić bezpośrednie przepisać od każdych trasach potrzebuje Kontroler:

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

co byłoby najlepszym sposobem podejść do tego problemu?

(używam pluginu request_routing dla subdomen)

+0

"Włączone" nie jest znacznikiem. –

Odpowiedz

17

Faktycznie, prawdopodobnie chcesz, aby ustawić typ mime w mime_types.rb i zrobić to w respond_to bloku, więc nie zwrócić go jako 'text/html':

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

Wtedy wasze drogi będzie wyglądać następująco:

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

Dla rails3:

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

oraz kontroler coś takiego (umieścić plik (i), w którym kiedykolwiek chcesz):

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 

na ryzyko overengineering, ja może nawet ulec pokusie, aby buforować plik odczytać operacja ...

Och, tak, prawie na pewno będziesz musiał usunąć/przenieść istniejący plik 'public/robots.txt'.

Uważni czytelnicy zauważą, że można łatwo zastąpić RAILS_ENV dla subdomain ...

+3

Dzięki za opublikowanie tego, zainspirowało mnie to - trochę uprościłem tę technikę i zaktualizowałem dla Rails 3. http://www.timbabwe.com/2011/08/rails-robots-txt-standardowo-przez-rodowisko-automatycznie/ – tkrajcar

+0

Dzięki. Podobało mi się twoje rozwiązanie. Opublikowaliśmy rozwiązanie Rails 3.x z kilkoma drobnymi zmianami. –

0

Jeśli nie można skonfigurować serwer HTTP, aby to zrobić, zanim wniosek zostanie wysłany do szyn, chciałbym tylko konfigurację kontrolera „roboty”, które sprawia, szablon taki jak:

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

W zależności od tego, co próbujesz osiągnąć, możesz również użyć pojedynczego szablonu zamiast kilku różnych plików.

10

Dlaczego nie korzystać z szyn wbudowanych w widokach?

W kontrolerze dodać tę metodę:

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

W widoku utworzyć plik: app/views/static_pages/robots.txt.erb z robots.txt zawartości

W routes.rb miejscu:

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

Usuń plik /public/robots.txt

You może w razie potrzeby dodać określoną logikę biznesową, ale w ten sposób nie odczytujemy żadnych plików niestandardowych.

0

lubiłem rozwiązanie TA Tyree, ale to jest bardzo Rails 2.x Centric tak oto co wymyśliłem dla Rail 3.1.x

mime_types.rb

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

Dodając format w trasy, których nie musisz martwić się o użycie bloku respond_to w kontrolerze. routes.rb

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

dodałam trochę coś ekstra na ten jeden. Pracownicy SEO skarżyli się na powieloną zawartość zarówno w subdomenach, jak i na stronach SSL, więc utworzyłem dwa pliki robota dla produkcji i jeden dla nie produkcji, który będzie również obsługiwany z dowolnymi żądaniami SSL/HTTPS w produkcji.

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

dla szyn 3:

Tworzenie RobotsController Kontroler:

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 

Tworzenie robotom widoki (1 na subdomeny):

  • widoki /robots/robots.subdom ain1.txt
  • views/roboty/robots.subdomain2.txt
  • etc ...

Dodaj nową trasę w config/routes.rb: (uwaga: txt opcję Format)

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

I oczywiście, należy zadeklarować: txt formatu w config/inicjalizatorów/Mime_types.rb:

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

Nadzieję, że to pomaga.