ruby-on-rails googlebot missing-template

ruby on rails - Googlebot recibe un error de plantilla faltante para una plantilla existente



ruby-on-rails missing-template (4)

En los últimos días, hemos empezado a recibir un error de plantilla faltante cuando el bot de Google intenta acceder a nuestra página principal (bienvenida / índice). He estado mirando esto por un par de horas y sé que me estoy perdiendo algo simple.

A ActionView::MissingTemplate occurred in welcome#index: Missing template welcome/index with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml, :haml], :formats=>["*/*;q=0.9"], :locale=>[:en, :en]}

Pero la plantilla existe (index.html.haml). Si no fuera así, nadie podría acceder a nuestra página de inicio.

Aquí hay alguna información adicional del entorno:

* REMOTE_ADDR : 66.249.72.139 * REMOTE_PORT : 56883 * REQUEST_METHOD : GET * REQUEST_URI : / * Parameters: {"controller"=>"welcome", "action"=>"index"}

Cualquier información que tengas sería muy apreciada.


Estos errores provienen de la forma en que GoogleBot formatea su encabezado HTTP_ACCEPT . Si bien es válido ( ver referencia W3 ), agrega un q=0.6 (la última cifra puede cambiar) que se usa como separador. Ya que no se especifica ningún otro tipo de medio, este q=0.6 no es necesario y asumo que es por eso que Rails no trata el encabezado correctamente.

(Parece depender de la versión de Rails. En Rails 3.0.12, genera una excepción MissingTemplate ).

Agregar el siguiente código de una respuesta anterior al controlador en cuestión no es suficiente: responde con un error 406 .

respond_to do |format| format.html end

Para hacer que esto funcione bajo Rails 3.0.12 y que se devuelva algo a GoogleBot (mejor que un error 406 ), debe agregar este código que establece el formato de la solicitud en html tan pronto como */*;q=0.6 HTTP_ACCEPT se detecta (Rails carga el valor del encabezado en request.format ).

# If the request ''HTTP_ACCEPT'' header indicates a ''*/*;q=0.6'' format, # we set the format to :html. # This is necessary for GoogleBot which perform its requests with ''*/*;q=0.6'' # or similar HTTP_ACCEPT headers. if request.format.to_s =~ %r%/*///*% request.format = :html end respond_to do |format| format.html end

Mientras trabaja, esta solución necesita que el código se agregue a cualquier acción del controlador que desea que GoogleBot indexe, ¡lo que realmente no está SECO!

Para solucionar este problema de una vez por todas, implementé un middleware de Rack pequeño que funciona mejor : comprueba el encabezado HTTP_ACCEPT la solicitud y reemplazará cualquier encabezado que coincida con */*;q=0.6 (las cifras pueden variar) por el común */* . Esto es aún mejor porque dado que q=0.6 no tiene significado si no es seguido por otro tipo de medio, este cambio del encabezado no cambia su significado. No forzamos a Rails en ningún formato dado, solo decimos que cualquier cosa hará de una manera que pueda entender.

Puede encontrar el middleware, el inicializador de carga y una prueba de integración en esta gist .

Versión de la gema aquí: https://github.com/ouvrages/rails_fix_google_bot_accept


La solución al problema es especificar el formato en su acción.

Hasta ahora, simplemente tenía lo siguiente en mi acción de índice

def index end

Una vez inserté un bloque respond_to

def index respond_to do |format| format.html end end

Dejé de obtener los errores de plantilla que faltan.


También estoy recibiendo lo mismo, hice una investigación y llegué a la conclusión de que es un "error" en Rails. */*;q=0.9 es el valor del parámetro de aceptación HTTP. No estoy exactamente seguro de lo que está pasando, pero en Rails 3.0 esto funciona. En Rails 3.1 devuelve una respuesta 500, y en Rails 3.2 devuelve una respuesta 406.

Actualizar:

Hay un error abierto con respecto a este problema. Una solución es establecer esta nueva opción en Rails 3.1:

config.action_dispatch.ignore_accept_header = true

Sin embargo ... si sirve cualquier otra página que no sea HTML, deberá confiar en la extensión para indicar el tipo (por ejemplo, /users/1.json ) en lugar de aceptar encabezados.


la parte interesante en el error que publicaste es :formats=>["*/*;q=0.9"]

La aplicación rails intenta encontrar una plantilla para el formato "*/*;q=0.9" que no va a funcionar.

Supongo que Google está de alguna manera utilizando esto como un parámetro de consulta de formato como welcome?format=*/*;q=0.9

Las versiones de los últimos rieles de afaik solo generarán un 406 en esos casos.