带有Rails的UTF-8中的循环无效字节序列

时间:2014-07-19 13:34:25

标签: ruby ruby-on-rails-3 utf-8 rack

环境

  • Rails 3.2.11
  • Ruby 1.9.1
  • utf8-cleaner gem

我正在努力解决这个问题一年多了,而且我无法在我的开发环境中重现它,这使我很难理解为什么会发生这种情况以及如何解决。这是我得到的错误通知(通过使用ExceptionNotifier的电子邮件):

A ArgumentError occurred in home#index:

  invalid byte sequence in UTF-8
  .bundle/gems/ruby/1.9.1/gems/rack-1.4.5/lib/rack/utils.rb:104:in `normalize_params'

显然是由中国蜘蛛引起的:

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

我尝试过几件事,看看我earlier question我试图捕捉错误的地方。

我还有安装程序utf8-cleaner gem,但这似乎无法解决,除非我错过了一步。

如何重现此问题?请注意,当我访问它时,导致问题的URL完全正确(?)

更新20140721 - 使用rack-utf8_sanitizer

  • gem 'rack-utf8_sanitizer'
  • 中添加Gemfile
  • config.middleware.insert 0, Rack::UTF8Sanitizer
  • 中添加application.rb
  • $ bundle install

在我的Heroku PRODUCTION上完全适用于DEV但失​​败了,存在以下问题:

$ heroku run rake middleware --a test-app
Running `rake middleware` attached to terminal... up, run.4846
WARNING: Nokogiri was built against LibXML version 2.8.0, but has dynamically loaded 2.7.6
rake aborted!
uninitialized constant Rack::UTF8Sanitizer
/app/config/application.rb:71:in `<class:Application>'

我仍在调查我为什么要这样做。

2 个答案:

答案 0 :(得分:1)

我设法修复它(在Rails 3.2.18应用程序上),如本主题所述:

https://gist.github.com/joost/ca4eda8f31655cf6095a

答案 1 :(得分:1)

重现

引起的问题
HTTP_USER_AGENT      : Mozilla/5.0 (compatible; EasouSpider; +http://www.easou.com/search/spider.html)

创建ruby脚本

#!ruby
invalid = "data\xed\xe5\xed\xe0".force_encoding('ASCII-8BIT')
`curl localhost:3000 -d #{invalid}`

rack-utf8_sanitizer gem添加到您的Gemfile

这解决了我的Dev环境,但不适用于Heroku。我相应地更新了我的问题。

更新:

我在application.rb文件中添加了require“rack / utf8_sanitizer”,这似乎解决了Heroku问题。