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

您将获得的任何见解将不胜感激。

这些错误来自GoogleBot格式化其HTTP_ACCEPT标头的方式 。 虽然有效( 参见W3参考 ),但它增加了q=0.6 (最后一个数字可能会改变) ,用作分隔符。 由于没有指定其他媒体类型,因此不需要此q=0.6 ,我认为这就是Rails不正确处理标头的原因。

(它似乎依赖于Rails版本。在Rails 3.0.12上,它引发了一个MissingTemplateexception。)

将先前答案中的以下代码添加到相关控制器是不够的:它以错误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进入任何给定的格式,我们只是告诉它任何将以它能理解的方式做的事情。

您可以在此要点中找到中间件,加载初始化程序和集成测试。

gem版本: https : //github.com/ouvrages/rails_fix_google_bot_accept

我也是这样,我做了一些调查,得出的结论是Rails中的“bug”。 */*;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 )而不是接受标题。

该问题的解决方案是在操作中指定格式。

到目前为止,我在索引操作中只有以下内容

 def index end 

一旦我插入了respond_to块

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

我停止了丢失模板错误。

您发布的错误中有趣的部分是:formats=>["*/*;q=0.9"]

rails-app试图找到格式为"*/*;q=0.9"的模板,但该模板不起作用。

我想谷歌以某种方式使用它作为格式查询参数,如welcome?format=*/*;q=0.9

afaik最新的rails版本将在这些情况下呈现406。

Interesting Posts