2010-05-01 8 views
8

Tengo un sitio con varios subdominios y quiero que los archivos robots.txt de los subdominios nombrados sean diferentes de www.robots.txt múltiple para subdominios en rieles

He intentado utilizar .htaccess, pero el FastCGI no lo ve.

Por lo tanto, yo estaba tratando de establecer rutas, pero no parece que no se puede hacer una reescritura directa desde cada rutas necesita un controlador:

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

¿Cuál sería la mejor manera de abordar este problema?

(estoy usando el plugin request_routing para los subdominios)

+0

"on" no es una etiqueta. –

Respuesta

17

En realidad, es probable que desee establecer un tipo MIME en mime_types.rb y hacerlo en un bloque respond_to por lo que no vuelve como 'text/html':

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

Entonces, sus rutas se vería así:

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

Para rails3:

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

y el controlador algo como esto (ponga el fichero (s) donde quiera que te gusta):

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 

a riesgo de manipulación excesiva, yo incluso podría estar tentado a almacenar en caché el archivo operación de lectura ...

Oh, sí, seguramente tendrá que quitar/mover el archivo existente 'public/robots.txt'.

lectores astutos notarán que se puede sustituir fácilmente RAILS_ENV para subdomain ...

+3

Gracias por publicar esto, esto me inspiró - simplifiqué un poco esta técnica y la actualicé para Rails 3. http://www.timbabwe.com/2011/08/rails-robots-txt-customized-by-environment-automatically/ – tkrajcar

+0

Gracias me ha gustado su solución. He publicado una solución de Rails 3.x con algunos pequeños cambios. –

0

Si no puede configurar el servidor HTTP de hacer esto antes de que la solicitud se envía a los rieles, me acaba de configurar un controlador de 'robots', que muestra una plantilla como:

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

Dependiendo de lo que esté tratando de lograr, también podría usar una única plantilla en lugar de varios archivos diferentes.

10

Por qué no usar los carriles construidos en puntos de vista?

En su controlador añadir este método:

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

En la vista de crear un archivo: app/views/static_pages/robots.txt.erb con contenido robots.txt

En lugar routes.rb:

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

Eliminar el archivo /public/robots.txt

Usted puede agregar una lógica comercial específica según sea necesario, pero de esta manera no leemos ningún archivo personalizado.

0

me ha gustado la solución de TA Tyree, pero es muy rieles centrada 2.x así que aquí es lo que se me ocurrió para 3.1.x Rail

mime_types.rb

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

Al añadir el formato en el las rutas de las que no tiene que preocuparse usan un bloque de respuesta en el controlador. routes.rb

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

he añadido un poco de algo extra en este caso. La gente de SEO se quejaba del contenido duplicado tanto en los subdominios como en las páginas SSL, así que creé dos archivos de robot para la producción y uno para la no producción, que también se servirá con cualquier solicitud de SSL/HTTPS en producción.

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

para los carriles 3:

Crear una RobotsController controlador:

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 

crear robots vistas (1 por subdominio):

  • vistas /robots/robots.subdom ain1.txt
  • vistas/robots/robots.subdomain2.txt
  • etc ...

añadir una nueva ruta en config/routes.rb: (nótese el: txt opción de formato)

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

Y, por supuesto, debe declarar el: formato txt en config/inicializadores/Mime_types.rb:

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

espero que ayude.