【问题标题】:Googlebot receiving missing template error for an existing templateGooglebot 收到现有模板的缺少模板错误
【发布时间】:2012-02-11 11:56:03
【问题描述】:

在过去的几天里,当 google bot 尝试访问我们的主页(欢迎/索引)时,我们开始收到缺少模板的错误。我已经盯着这个看了几个小时,知道我只是错过了一些简单的东西。

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

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

【问题讨论】:

  • 您是否尝试过在 Google 网站管理员工具上使用“Fetch as Googlebot”来查看是否有更清晰的错误? support.google.com/webmasters/bin/…
  • 好建议。我刚刚做了,它成功返回。但是,我似乎无法告诉谷歌使用 https,这是发生错误的协议。
  • 很奇怪,您是否也检查过“诊断”中的抓取错误区域,看看您是否在 Google 那里报告了任何内容?也许它正在传递一些参数。
  • 啊,精神上的日出。虽然我没有收到任何 html 错误,但我收到了 chtml 错误。有关如何更好地管理这些请求的任何建议?
  • 我看到了同样的错误,但也没有解决方案。网站管理员工具“Fetch as Googlebot”在 http 和 https 版本上运行良好。它似乎是一个特殊的谷歌机器人,而不是普通的。用户代理是“DoCoMo/2.0 N905i(c100;TB;W24H16)(兼容;Googlebot-Mobile/2.1;+google.com/bot.html)”

标签: ruby-on-rails googlebot missing-template


【解决方案1】:

这些错误来自 GoogleBot 格式化其 HTTP_ACCEPT 标头的方式。虽然有效 (see W3 reference),但它添加了一个 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 错误更好),您需要添加此代码,将请求的格式设置为 @987654332 @一旦检测到*/*;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 索引的任何控制器操作中,这真的不是 DRY!

为了彻底解决这个问题,我实现了一个更好的小型 Rack 中间件:它检查请求的 HTTP_ACCEPT 标头,并将替换任何与 */*;q=0.6 匹配的标头 (数字可能会有所不同) 由常见的*/*。这甚至更好,因为q=0.6 如果后面没有其他媒体类型,则没有任何意义,因此标头的这种更改不会改变其含义。 我们不会强制 Rails 采用任何给定的格式,我们只是告诉它任何可以理解的方式。

您可以在gist 中找到中间件、加载初始化程序和集成测试。

这里的宝石版本: https://github.com/ouvrages/rails_fix_google_bot_accept

【讨论】:

  • 谢谢,这是一个很好的解决方案。这比406 好得多。
  • 我根据你的要点做了一个 gem:github.com/ouvrages/rails_fix_google_bot_accept
  • @MichaëlWitrant 感谢您将其变成宝石!
  • 看起来 Rails 4 正确处理了q 参数,至少从我有限的测试来看是这样。
【解决方案2】:

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

到目前为止,我的索引操作中只包含以下内容

def index

end

一旦我插入了一个 respond_to 块

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

我不再收到缺少模板的错误。

【讨论】:

  • 添加此代码会使我的应用程序响应错误HTTP/1.1 406 Not Acceptable。我不知道这是否是我想要的。 (在 Rails 3.0.12 下)
【解决方案3】:

我也有同样的情况,我做了一些调查并得出结论,这是 Rails 中的一个“错误”。 */*;q=0.9 是 HTTP 接受参数的值。我不确定发生了什么,但在 Rails 3.0 中这是可行的。在 Rails 3.1 中它返回 500 响应,而在 Rails 3.2 中它返回 406 响应。

更新:

关于这个问题有一个open bug。一种解决方法是在 Rails 3.1 中设置这个新选项:

config.action_dispatch.ignore_accept_header = true

但是...如果您提供 HTML 以外的任何页面,则需要依靠扩展来表示类型(例如 /users/1.json)而不是接受标题。

【讨论】:

  • 感谢您的更新。我正在运行 3.0.7。所以这可能不适用于我的情况。
【解决方案4】:

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

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

我猜 google 以某种方式将其用作格式查询参数,例如 welcome?format=*/*;q=0.9

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

【讨论】:

  • 这不是来自accept-header,说它会接受任何类型的文件吗?
  • 我认为它必须以某种方式被您的 Rails 应用程序解释为一种格式。否则没有理由在这个主题上抛出错误。
  • 可以在本地表示:rails s -e production,在其他终端写入:curl -v -H "Accept: /; q=0.9" 127.0.0.1:3000
猜你喜欢
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多