TDH*_*TDH 19 googlebot ruby-on-rails missing-template
在过去的几天里,当谷歌机器人试图访问我们的主页(欢迎/索引)时,我们已经开始收到丢失的模板错误.我一直盯着这几个小时,知道我只是缺少一些简单的东西.
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]}
Run Code Online (Sandbox Code Playgroud)
但模板确实存在(index.html.haml).如果没有,没有人可以访问我们的主页.
以下是一些其他环境信息:
* REMOTE_ADDR : 66.249.72.139
* REMOTE_PORT : 56883
* REQUEST_METHOD : GET
* REQUEST_URI : /
* Parameters: {"controller"=>"welcome", "action"=>"index"}
Run Code Online (Sandbox Code Playgroud)
您将获得任何见解将不胜感激.
rch*_*ier 16
这些错误来自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
Run Code Online (Sandbox Code Playgroud)
为了使下的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
Run Code Online (Sandbox Code Playgroud)
在工作时,此解决方案需要将代码添加到您希望由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
Run Code Online (Sandbox Code Playgroud)
但是......如果您提供除HTML以外的任何页面,则需要依赖扩展名来表示类型(例如/users/1.json)而不是接受标题.
问题的解决方案是在您的操作中指定格式。
到目前为止,我的索引操作中只包含以下内容
def index
end
Run Code Online (Sandbox Code Playgroud)
一旦我插入了 respond_to 块
def index
respond_to do |format|
format.html
end
end
Run Code Online (Sandbox Code Playgroud)
我不再收到丢失模板的错误。
| 归档时间: |
|
| 查看次数: |
3574 次 |
| 最近记录: |