Подтвердить что ты не робот

Googlebot получает отсутствующую ошибку шаблона для существующего шаблона

В течение последних нескольких дней мы начали получать недостающую ошибку шаблона, когда бот-бот пытается получить доступ к нашей главной домашней странице (приветствовать/индексировать). Я смотрю на это пару часов и знаю, что я просто пропустил что-то простое.

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]}

Но шаблон существует (index.html.haml). Если бы никто не мог получить доступ к нашей домашней странице.

Ниже приведена дополнительная информация о среде:

* REMOTE_ADDR                               : 66.249.72.139
* REMOTE_PORT                               : 56883
* REQUEST_METHOD                            : GET
* REQUEST_URI                               : /

* Parameters: {"controller"=>"welcome", "action"=>"index"}

Любые идеи, которые у вас есть, будут очень признательны.

4b9b3361

Ответ 1

Решение проблемы - указать формат в вашем действии.

До сих пор у меня просто было следующее в действии индекса

def index

end

Как только я вставил блок reply_to

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

Я прекратил получать недостающие ошибки шаблона.

Ответ 2

Эти ошибки исходят из того, как GoogleBot форматирует заголовок HTTP_ACCEPT. Пока он действителен (см. Ссылку W3), он добавляет q=0.6 (последняя цифра может меняться), которая используется как разделитель. Поскольку не указан другой тип носителя, этот q=0.6 не нужен, и я предполагаю, что Rails неправильно обрабатывает заголовок.

(Кажется, что это зависит от версии Rails. В Rails 3.0.12 он вызывает исключение MissingTemplate.)

Недостаточно добавить следующий код из предыдущего ответа на соответствующий контроллер: он отвечает ошибкой 406.

respond_to do |format|
  format.html
end

Чтобы сделать эту работу под Rails 3.0.12 и , что-то вернулось к ошибке GoogleBot (лучше, чем 406), вам нужно добавить этот код, который устанавливает формат запроса html, как только обнаружен */*;q=0.6 -like HTTP_ACCEPT (Rails загружает значение заголовка в 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

При работе это решение нуждается в коде, который будет добавлен к любому действию контроллера, которое вы хотите проиндексировать GoogleBot, что действительно не СУХОЙ!

Чтобы устранить эту проблему один раз для всех, я реализовал небольшое промежуточное ПО Rack, которое делает еще лучше: он проверяет заголовок запроса HTTP_ACCEPT и заменяет любой заголовок, соответствующий */*;q=0.6 (цифры может меняться) общим */*. Это даже лучше, потому что поскольку q=0.6 не имеет смысла, если за ним не следует другой тип носителя, это изменение заголовка не меняет его значения. Мы не вставляем Rails в любой формат, мы просто скажем, что любой будет делать так, как он может понять.

Вы можете найти промежуточное ПО, инициализатор загрузки и тест интеграции в gist.

Версия Gem здесь: https://github.com/ouvrages/rails_fix_google_bot_accept

Ответ 3

Я тоже получаю то же самое, я провел некоторое расследование и пришел к выводу, что это "ошибка" в Rails. */*;q=0.9 - значение параметра accept accept. Я не совсем уверен, что происходит, но в Rails 3.0 это работает. В Rails 3.1 он возвращает ответ 500, а в Rails 3.2 возвращается ответ 406.

Update:

В этой проблеме обнаружена ошибка . Один из способов - установить этот новый параметр в Rails 3.1:

config.action_dispatch.ignore_accept_header = true

Однако... если вы обслуживаете какие-либо страницы, отличные от HTML, вам нужно будет полагаться на расширение, чтобы обозначать тип (например, /users/1.json), а не принимать заголовки.

Ответ 4

интересная часть ошибки, которую вы опубликовали, :formats=>["*/*;q=0.9"]

rails-app пытается найти шаблон для формата "*/*;q=0.9", который не будет работать.

Я предполагаю, что Google каким-то образом использует это как параметр запроса формата, например welcome?format=*/*;q=0.9

В последних версиях версии afaik будут отображаться только 406.