在我的Rails生产网站上,有时会出现以下错误:
#:
中发生了一个ActionController :: UnknownHttpMethodTRACK,可接受的HTTP方法是OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE,CONNECT,PROPFIND,PROPPATCH,MKCOL,COPY,MOVE,LOCK,UNLOCK,VERSION-CONTROL,REPORT,CHECKOUT,CHECKIN,UNCHECKOUT ,MKWORKSPACE,UPDATE,LABEL,MERGE,BASELINE-CONTROL,MKACTIVITY,ORDERPATCH,ACL,SEARCH,MKCALENDAR和PATCH
我想这是机器人使用Rails无法处理的HTTP方法访问我的网站的情况(在我的情况下,大多数情况是 OPENVAS , TRACK , DEBUG < / strong>, 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
但是我的自定义控制器可能不会导致错误吗?
感谢您的帮助。
答案 0 :(得分:2)
由于这些都是您将无法处理的请求,因此更好的方法是将https方法限制在nginx级别,以使这些方法完全不会发生问题:
server {
# (your vhost for this app)
if ($request_method !~ ^(GET|HEAD|PUT|POST|DELETE|OPTIONS|PATCH)$ ){
return 405;
}
}
答案 1 :(得分:0)
实际上,最让我困扰的是当机器人使用未知的HTTP方法访问我的网站时,我从Rails获得的Exception Notifications。 (有时我会在几秒钟内收到十几打左右的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}
}
让我们看看结果如何。我将在几周后发布更新。