如何消除 ActionController::UnknownHttpMethod 错误?

Tin*_*n81 6 ruby-on-rails http nginx

在我的 Rails 生产网站上,我有时会收到十几个左右的错误:

# 中发生 ActionController::UnknownHttpMethod:

TRACK,接受的 HTTP 方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT、PROPFIND、PROPPATCH、MKCOL、COPY、MOVE、LOCK、UNLO​​CK、VERSION-CONTROL、REPORT、CHECKOUT、CHECKIN、UNCHECKOUT、MKWORKSPACE、更新、标签、合并、基线控制、MKACTIVITY、ORDERPATCH、ACL、SEARCH、MKCALENDAR 和 PATCH

我想这是当机器人使用 Rails 无法处理的 HTTP 方法访问我的网站时(在我的情况下,它主要是OPENVASTRACKDEBUGTRACKINDEX ,但也有像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
Run Code Online (Sandbox Code Playgroud)
class ErrorsController < ApplicationController

  def show
    status = params[:status] || 500
    @title = "Error"
    render(:status => status, :template => "errors/show.html.erb")
  end

end
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助。

Vas*_*fed 9

由于这些是您无论如何都不会处理的请求,更好的方法是在 nginx 级别限制 https 方法,以便这些方法根本不会出现问题:

server {
  # (your vhost for this app)

  if ($request_method !~ ^(GET|HEAD|PUT|POST|DELETE|OPTIONS|PATCH)$ ){
    return 405;
  }
}
Run Code Online (Sandbox Code Playgroud)


Tin*_*n81 5

实际上,最困扰我的是当机器人使用未知的 HTTP 方法访问我的网站时,我从 Rails 收到的异常通知。An ActionController::UnknownHttpMethod occurred in ...(有时我会在几秒钟内收到十几封异常电子邮件 \xc3\xa0 la 。)

\n\n

所以在我的中production.rb我添加了一行:

\n\n
  config.middleware.use ExceptionNotification::Rack,\n    :ignore_exceptions => [\'ActionController::UnknownHttpMethod\'] + ExceptionNotifier.ignored_exceptions, # I added this line\n    :email => {\n      :email_prefix => "[ERROR]",\n      :sender_address => %{"Error Notification" <notification@mydomain.com>},\n      :exception_recipients => %w{administrator@mydomain.com}\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n