在我的 Rails 生产网站上,我有时会收到十几个错误,如下所示:
一个 ActionController::UnknownHttpMethod 发生在 # 中:
跟踪,接受的HTTP方法是选项,获取,头,发布,放置,删除,跟踪,连接,PROFIND,PROPATCH,MKCOL,复制,移动,锁定,解锁,版本控制,报告,签出,签入,取消签出,MKWORKSPACE,更新,标签,合并,基线控制,MKACTIVITY,订单补丁,ACL,搜索,MK日历和补丁
我想这是当机器人使用Rails无法处理的HTTP方法访问我的网站时(在我的情况下,它主要是OPENVAS,TRACK,DEBUG,TRACK和INDEX,但也有像WMIXLVXM这样的奇怪方法)。
有没有办法以任何方式使这些消息静音?我仍然不确定这是Rails问题还是Nginx问题。
我正在使用自定义控制器向用户呈现自定义错误页面:
Rails.application.routes.draw do
%w(404 500).each do |status|
match status, :to => 'errors#show', :status => status, :via => :all
end
...
end
class ErrorsController < ApplicationController
def show
status = params[:status] || 500
@title = "Error"
render(:status => status, :template => "errors/show.html.erb")
end
end
但是我的自定义控制器可能不会导致错误?
感谢您的任何帮助。
由于这些是你无论如何都不会处理的请求,更好的方法是在nginx级别限制https方法,这样这些方法就不会碰轨:
server {
# (your vhost for this app)
if ($request_method !~ ^(GET|HEAD|PUT|POST|DELETE|OPTIONS|PATCH)$ ){
return 405;
}
}
实际上,最困扰我的是当机器人使用未知的HTTP方法访问我的网站时,我从Rails收到的异常通知。(有时我会在几秒钟内收到十几封An ActionController::UnknownHttpMethod occurred in ...
的例外电子邮件。
所以在我的production.rb
中,我添加了一行额外的行:
config.middleware.use ExceptionNotification::Rack,
:ignore_exceptions => ['ActionController::UnknownHttpMethod'] + ExceptionNotifier.ignored_exceptions, # I added this line
:email => {
:email_prefix => "[ERROR]",
:sender_address => %{"Error Notification" <notification@mydomain.com>},
:exception_recipients => %w{administrator@mydomain.com}
}
让我们看看这是如何解决的。我将在几周内发布更新。