在过去的几天里,当谷歌机器人试图访问我们的主页(欢迎/索引)时,我们已经开始收到丢失的模板错误。我一直盯着这几个小时,知道我只是缺少一些简单的东西。
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"}
您的任何见解将不胜感激。
答案 0 :(得分:16)
这些错误来自 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
错误),您需要添加此代码,将请求的格式设置为html
*/*;q=0.6
一旦检测到HTTP_ACCEPT
,就会发现request.format
(Rails会将标头值加载到# 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
中)。
HTTP_ACCEPT
在工作时,此解决方案需要将代码添加到您希望由GoogleBot编制索引的任何控制器操作中,这真的不是DRY!
为了解决这个问题一次,我实现了一个更好的小型Rack中间件:它检查请求的*/*;q=0.6
标头,并将替换匹配{{1}的任何标头公共*/*
可以使用(数字可以变化)。这甚至更好,因为q=0.6
如果没有其他媒体类型后面没有意义,则标题的这种更改不会改变其含义。 我们不会强制使用任何给定格式的Rails,我们只是告诉它任何可以理解的方式。
您可以在此gist中找到中间件,加载初始值设定项和集成测试。
Gem版本: https://github.com/ouvrages/rails_fix_google_bot_accept
答案 1 :(得分:6)
我也是这样,我做了一些调查,得出的结论是Rails中的'bug'。 */*;q=0.9
是HTTP accept参数的值。我不确定发生了什么,但在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
),而不是接受标题。
答案 2 :(得分:4)
问题的解决方案是在操作中指定格式。
到目前为止,我的索引操作中只有以下内容
def index
end
我插入了respond_to块
def index
respond_to do |format|
format.html
end
end
我停止了丢失的模板错误。
答案 3 :(得分:1)
您发布的错误中有趣的部分是:formats=>["*/*;q=0.9"]
rails-app尝试查找格式"*/*;q=0.9"
的模板,该格式不起作用。
我猜谷歌以某种方式将其用作格式查询参数,例如welcome?format=*/*;q=0.9
afaik最新的rails版本只会在这些情况下渲染406.