我有一个操作为我的主页服务。它在正常访问时(即由网络浏览器中的用户访问)时工作正常,但是当特定网络爬虫访问时,它会抛出以下错误:
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
的文件并在其中添加一些胡言乱语的唯一方法吗?或者我可以更优雅地解决这个问题吗?
我也看到了这些。您可以使用一些中间件来重写这些请求:
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发现请求,将这个中间件添加到其中似乎是有意义的。
https://github.com/jwigal/rack-options-request
事实证明,这组特定的机器人像石头一样愚蠢,并且像我试图做的那样忽略任何类型的请求格式。我最终在我的robots.txt
中不允许这些机器人的用户代理。没有更多的错误。但是,如果有人有更优雅的解决方案,请发布它,我会将其标记为接受的答案,否则,我会在几天内接受这个。