对于我的一个项目,我偶尔得到这个例外:
ActionView :: MissingTemplate:缺少模板博客/索引{:handlers => [:rxml,:erb,:builder,:rjs,:haml,:rhtml],:formats => ["image/jpeg","image/pjpeg","image/png","image/gif"],:locale => [:en,:en]}在视图路径"/ var/www/keeponposting/releases/20110403083651/app/views"
似乎有人从不是图像的URL请求图像:
HTTP_ACCEPT"image/jpeg,image/pjpeg,image/png,image/gif"
有什么想法可以做些什么吗?我是否必须为其中一个实现处理程序并返回""以消除此异常或是否有更好的方法来处理它?
现在我也得到了这个:
ActionView :: MissingTemplate:缺少模板博客/索引{:formats => ["text/*"],:handlers => [:rjs,:haml,:rhtml,:erb,:rxml,:builder],:locale => [:en,:en]}在视图路径"/ var/www/keeponposting/releases/20110415040109/app/views"
无论请求的格式是什么,都没有办法发回HTML?
Pab*_*zzi 13
我同意阻止有问题的机器人,但如果你真的想强制响应格式添加before_filter
和设置request.format = :html
,如下所示:
before_filter :force_request_format_to_html
private
def force_request_format_to_html
request.format = :html
end
Run Code Online (Sandbox Code Playgroud)
我用这个新的Rails 3.1选项修复了这个问题(几分钟前 - 到目前为止,这么好):
config.action_dispatch.ignore_accept_header = true
Run Code Online (Sandbox Code Playgroud)
如本Rails问题所述.那就是config/application.rb
.
我在RSpec请求测试(使用Capybara)中测试了它:
it "should not break with HTTP_ACCEPT image/*;w=320;h=420 from iPhone" do
page.driver.header "Accept", "image/*;w=320;h=420"
visit "/some/path"
page.should have_content("Some content")
end
Run Code Online (Sandbox Code Playgroud)
这是一个更严格的回应; 关于问题4127的讨论,purp的建议.
class FooController
rescue_from ActionView::MissingTemplate, :with => :missing_template
def missing_template
render :nothing => true, :status => 406
end
end
Run Code Online (Sandbox Code Playgroud)
我很想在应用程序控制器中解救MissingTemplate并记录Referrer标头以查看触发此请求的内容.你永远不知道,它可能是你自己的应用程序中一些不起眼的部分!
另一方面,如果您确信这是由机器人引起的,您是否考虑过将有问题的URL添加到robots.txt文件中?例如:
User-Agent: YandexImages
Disallow: /your/failed/path
Run Code Online (Sandbox Code Playgroud)
用机器人绊倒的路径替换"你的/失败/路径".如果机器人在整个地方挣扎,你可能只是不允许访问该特定机器人的整个站点:
User-Agent: YandexImages
Disallow: /
Run Code Online (Sandbox Code Playgroud)
我认为这比实现一个专门用于抑制看似表现不佳的机器人的错误的处理程序更简洁明了.