ruby-on-rails - 没有路由匹配 GET/sign_up,但我可以访问该页面?

标签 ruby-on-rails ruby-on-rails-4 heroku devise rollbar

我的 Rails 4 应用程序的生产服务器上记录了一个奇怪的错误:

ActionController::RoutingError: No route matches [GET] "/sign_up"

这显然令人担忧,因为这意味着新用户无法注册。
但是,如果我访问该 URL,无论是通过手动输入,还是单击我们主页上的按钮,我都可以看到注册页面。

没有重定向,URL 栏中的 URL 保持不变。

这是有问题的路线:
devise_scope :identity do
  get 'sign_in', :to => 'devise/sessions#new'
  get 'sign_up', :to => 'devise/registrations#new'
  get 'sign_out', :to => 'devise/sessions#destroy'
end

由于主题破解,我们主页上的按钮是一个使用 GET 提交的表单。我认为这可能是一个问题,但日志显示它正确接收了 GET 请求。

这里发生了什么?我应该从哪里开始寻找诊断?

更新

通过我们主页上的黑客攻击,我的意思是,由于 bootstrap 不支持 <a class="btn...在导航栏中,我们使用带有 GET 方法的表单来使用它支持的按钮类型 - 因此从服务器的角度来看,用户在单击该按钮时仍会发送 GET/sign_up 。这个按钮只是为了让他们进入/sign_up 页面 (registration_controller#new),而不是他们按下按钮来提交包含他们所有详细信息的注册表单。

(注册表单本身是正常的,即它发送一个POST)

需要明确的是,我已经手动完成了完整的注册过程,并且它有效。我从来没有收到过 404。而且当我进行演练时没有出现日志消息。

这是rake routes的相关部分
                       Prefix Verb     URI Pattern                                                       Controller#Action
         new_identity_session GET      /identities/sign_in(.:format)                                     devise/sessions#new
             identity_session POST     /identities/sign_in(.:format)                                     devise/sessions#create
     destroy_identity_session DELETE   /identities/sign_out(.:format)                                    devise/sessions#destroy
 cancel_identity_registration GET      /identities/cancel(.:format)                                      identities/registrations#cancel
        identity_registration POST     /identities(.:format)                                             identities/registrations#create
    new_identity_registration GET      /identities/sign_up(.:format)                                     identities/registrations#new
   edit_identity_registration GET      /identities/edit(.:format)                                        identities/registrations#edit
                              PATCH    /identities(.:format)                                             identities/registrations#update
                              PUT      /identities(.:format)                                             identities/registrations#update
                              DELETE   /identities(.:format)                                             identities/registrations#destroy
                      sign_in GET      /sign_in(.:format)                                                devise/sessions#new
                      sign_up GET      /sign_up(.:format)                                                devise/registrations#new
                     sign_out GET      /sign_out(.:format)                                               devise/sessions#destroy

更新 2

我们仍然在我们的生产服务器上记录这个问题。
错误来自滚动条。
有趣的是,它没有出现在我们的生产日志中。
生产日志正在使用 one line logging .
我们在开发中无法重现它,这是访问页面的日志:
Started GET "/sign_up" for 127.0.0.1 at 2017-01-02 12:25:10 +0800
Processing by Devise::RegistrationsController#new as HTML
  Rendered identities/shared/_sign_up.html.erb (203.5ms)
  Rendered identities/registrations/new.html.erb within layouts/focused (277.2ms)
  Rendered layouts/_social_headers.html.erb (39.1ms)
  Rendered layouts/_google_analytics.html.erb (6.2ms)
  Rendered layouts/_scripts.html.erb (3618.9ms)
  Rendered layouts/_hotjar.html.erb (4.7ms)
  Rendered layouts/_html_head.html.erb (3708.2ms)
  Nation Load (4.5ms)  SELECT  "nations".* FROM "nations" WHERE "nations"."id" IS NULL  ORDER BY "nations"."id" ASC LIMIT 1
  Rendered layouts/_topnavbar.html.erb (101.0ms)
  Rendered layouts/_breadcrumb.html.erb (7.4ms)
  Rendered layouts/_flash.html.erb (31.4ms)
  Rendered layouts/_footer2.html.erb (8.6ms)
Completed 200 OK in 4223ms (Views: 4203.2ms | ActiveRecord: 4.5ms)

最佳答案

原来这是由 Rollbar 引起的困惑。

Rollbar 按它们的类聚合异常,而不是默认情况下它们的错误消息。因此,在发送错误报告时,报告会显示来自该异常的第一个实例的错误消息。

所以在我们的例子中,我们第一次用 Rollbar 部署有一个错误,导致/sign_up 给我们一个 404 错误,这是固定的,但在那之后,任何 404 生成相同的异常类,所以当一个漏洞利用机器人请求时,说,/wp-login.php 我们会收到一封来自 Rollbar 的电子邮件,内容为:

ActionController::RoutingError: No route matches [GET] "/sign_up"

即使导致最近错误的实际路径不是/sign_up

我们通过在分组下更改滚动条上的设置以打开“包含异常消息”来解决此问题 - 这样新的 404 就不会与/sign_up 分组在一起

我也将此添加到 config/initializers/rollbar.rb过滤掉一些 404 被发送到 Rollbar。
  # Ignore bots trying to hack non existent end-points
  config.exception_level_filters.merge!('ActionController::RoutingError' => lambda { |e|
    e.message =~ %r(No route matches \[[A-Z]+\] "/(.+)")
    case $1.split("/").first.to_s.downcase
    when *%w(myadmin phpmyadmin w00tw00t pma cgi-bin xmlrpc.php wp wordpress cfide)
      'ignore'
    else
      'warning'
    end
  })

关于ruby-on-rails - 没有路由匹配 GET/sign_up,但我可以访问该页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40834278/

相关文章:

ruby-on-rails - 语法错误意外的tANDOP on rails 3教程

ruby-on-rails - 让 GeoKit 与我的 Address 类完美配合

ruby-on-rails - 如何在 Rails 4 中为某些路径有选择地启用 SSL?

ruby-on-rails - 传输编码无效

ruby-on-rails - 将单个表推送到 Heroku

Heroku 延迟问题

ruby-on-rails - Ruby on Rails - SoundCloud OAuth 2 未定义方法 `access_token'

ruby-on-rails - PG::UndefinedTable: 错误:关系不存在

ruby-on-rails - Rails 更改默认布局和 View 路径

docker - 从 Heroku 上的 Docker 容器中访问 X-Server