15

我有一个服务于我的主页的操作。正常访问时(即用户在网络浏览器中),它工作正常,但是当特定网络爬虫访问时,它会抛出以下错误:

 A ActionView::MissingTemplate occurred in tags#promoted:

 Missing template tags/promoted with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>["text/*"], :locale=>[:en, :en]} in view paths "/Apps/accounts/app/views", "/usr/local/rvm/gems/ruby-1.9.2-p180@accounts/gems/devise-1.3.0/app/views"
 actionpack (3.0.4) lib/action_view/paths.rb:15:in `find'

看起来机器人正在尝试获取text/*没有模板的格式,这是有道理的,所以我尝试在我的操作中执行以下操作:

  def promoted
   request.format = :html #force html to avoid causing missing template errors
   # more action stuff....
  end

本质上,我试图将请求的格式强制为 html,以便它为 html 模板提供服务。

然而,每次这些机器人请求此页面时,都会发生缺少模板的错误。

这没什么大不了的,但理想情况下,我想解决这个错误,如果我停止从我的应用程序收到这些错误电子邮件的话。

是制作文件my_action.text.erb并在其中放入一些乱码的唯一方法吗?或者我可以更优雅地解决这个问题吗?

4

2 回答 2

7

我也一直在看这些。您可以使用一些中间件来重写这些请求:

class Bot
  def initialize(app)
    @app = app
  end

  def call(env)
    h = env["HTTP_ACCEPT"]
    env["HTTP_ACCEPT"] = "text/html" if h == "text/*"
    @app.call(env)
  end
end

我为杀死一些 MS Office 发现请求而创建了一个 gem,将这个中间件添加到其中似乎是有意义的。

https://github.com/jwigal/rack-options-request

于 2011-09-17T03:07:44.747 回答
0

事实证明,这组特定的机器人像石头一样愚蠢,并且像我试图做的那样忽略任何类型的请求格式。我最终在我的robots.txt. 没有更多的错误。但是,如果有人有更优雅的解决方案,请发布它,我会将其标记为已接受的答案,否则,我会在几天内接受这个答案。

于 2011-05-10T04:40:48.727 回答