2016-11-27 56 views
7

我得到我的记录生产服务器上的一个奇怪的错误我的Rails应用4:没有路由匹配GET/sign_up,但我可以访问该页面?

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请求。

这是怎么回事?我应该从哪里开始寻找诊断呢?

UPDATE

通过我们的网页上的黑客,我的意思是,由于引导的导航栏不支持<a class="btn...,我们使用的是有方法得到的形式使用的那种按钮它支持 - 从服务器的角度来看,用户点击该按钮后仍然发送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) 
+0

你能显示你的耙路线的输出吗? – MageeWorld

+0

正如你所说的那样,由于'/ sign_up'请求是以'GET'方式发送的,所以你得到这个错误,你需要把方法改为POST,因为设计需要发送POST请求。你可以添加你的浏览页面吗? –

+0

@BalaKarthik我想我的描述可能会令人困惑,当然设计不需要POST来达到注册#新页面? 我已更新说明以阐明我使用GET的黑客的含义。 – ChristopherJ

回答

5

事实证明,这是造成翻车防护杆的混乱。

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

所以在我们的例子中,我们第一次使用Rollbar进行部署时有一个错误,导致/ sign_up给我们一个404错误,该错误已修复,但之后,任何404生成了相同的异常类,机器人请求,比如说/ wp-login。PHP我们将得到从ROLLBAR提到的电子邮件:

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

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

我们通过在分组上ROLLBAR改变我们设置这个固定打开“包含异常消息” - 以便新的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 
    })