Робот Google получает сообщение об отсутствии шаблона для существующего шаблона - PullRequest
19 голосов
/ 16 января 2012

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

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

Любые ваши идеи будут с благодарностью.

Ответы [ 4 ]

16 голосов
/ 05 апреля 2012

Эти ошибки происходят из-за того, что 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 -подобный 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 к какому-либо конкретному формату, мы просто сообщаем ему, что любой будет делать так, как он может понять.

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

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

6 голосов
/ 24 января 2012

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

Обновление:

Существует открытая ошибка по этому вопросу.Одним из обходных путей является установка этой новой опции в Rails 3.1:

config.action_dispatch.ignore_accept_header = true

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

4 голосов
/ 14 марта 2012

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

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

def index

end

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

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

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

1 голос
/ 16 января 2012

интересная часть в сообщенной вами ошибке: :formats=>["*/*;q=0.9"]

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

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

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

...