2014-07-07 4 views
7

Wir haben ein seltsames Problem mit einem Crawler. Gelegentlich wird es einen Rails FATAL Fehler auf einige Anfrage werfen, aber die Spur ist sehr begrenzt und sieht so etwas wie diesesgeheimnisvolle Schienen Fehler mit fast keine Spur

[2014-07-01 18:16:37] FATAL Rails : 
ArgumentError (invalid %-encoding (c^ FK+ 9u$_ t Kl 
ΥE! =k \ ̕* ߚ>c+<O یo ʘ> C  R! 2 D (5  x q#!` 4 p  |8 I E 
:+ H^9`^ # Vo{ > 

    =[z )): 
    lib/locale_middleware.rb:14:in `call' 

Der Crawler User-Agent

Mozilla/5.0 (compatible; EasouSpider; +http://www.easou.com/search/spider.html)

ist Wir können sie bitten, zu stoppen Crawlen uns über robots.txt, aber es wäre besser, mit der Grundursache zu beschäftigen und nicht mit 500 auf diese Anfragen scheitern, wenn möglich.

Wir können diese Art von Anfrage auch nicht wirklich reproduzieren, daher wären Vorschläge, wie man eine ähnliche Anfrage generiert, eine große Hilfe.

Wir verwenden Rails 3.2.19, Unicorn auf Ubuntu 12.04. Hier ist unser locale_middleware.rb

+0

Sie mit '% 9g' in Ihrer Anfrage-URL reproduzieren? ? Beispiel: http://your.site/path/to/a/get?%9g – Benj

+0

Ich vermute Ausnahme in der nächsten Middleware-Ebene passieren. Was geht nach LocaleMiddleware? Sie können "Rake Middleware" –

+0

@BenjaminSinclaire laufen - hinzufügen ''% 9g' scheint eine '400' Antwort von unserem Nginx zu erzeugen, es trifft nicht einmal Rails. Wo hast du dieses '% 9g' jedoch abgeholt ?? (Ich werde neugierig) – gingerlime

Antwort

4

Besonderer Dank an Benjamin Sinclaire für den Hinweis auf die right issue on github.

Die Lösung wurde on this comment beschrieben:

  • Installieren Sie das rack-robustness gem
  • fügen Sie diese application.rb:
config.middleware.use ::Rack::Robustness do |g| 
    g.no_catch_all 
    g.on(ArgumentError) { |ex| 400 } 
    g.content_type 'text/plain' 
    g.body{ |ex| ex.message } 
    g.ensure(true) { |ex| env['rack.errors'].write(ex.message) } 
end 
+1

Fängt dies alle "ArgumentError", einschließlich derer, die nichts mit Codierungsfehlern zu tun haben? Ich denke es tut, und das könnte problematisch sein. Wenn Sie das nicht möchten, [siehe diese Lösung] (http://stackoverflow.com/a/24727310/6962). –

+0

Soweit ich es verstehe, wird dies einen 'ArgumentError' fangen, der von außerhalb unserer App geworfen wird. Wir fangen 'ArgumentErrors' innerhalb unserer Codebasis auf unserem Application Controller trotzdem. Die Belichtung liegt also nur außerhalb der Codebasis, z. Middleware/Rails selbst. Außerdem habe ich dem obigen Snippet eine Logger-Methode hinzugefügt und bis jetzt nichts anderes entdeckt als diese Codierungsprobleme. – gingerlime

Verwandte Themen