如何沉默ActionController :: UnknownHttpMethod错误?

时间:2019-04-11 19:06:05

标签: ruby-on-rails http nginx

在我的Rails生产网站上,有时会出现以下错误:

  

#:

中发生了一个ActionController :: UnknownHttpMethod      

TRACK,可接受的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

但是我的自定义控制器可能不会导致错误吗?

感谢您的帮助。

2 个答案:

答案 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}
    }

让我们看看结果如何。我将在几周后发布更新。