URI :: InvalidURIError(URI必须仅为ascii)

时间:2018-05-03 14:50:48

标签: ruby-on-rails ruby

我有一个传统的rails 3.2应用程序,当我尝试使用none-ascii char命中路由时,例如; example.com/city/bergstraße然后我收到以下错误:

/Users/user/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/uri/rfc3986_parser.rb:20:in `split'
/Users/user/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/uri/rfc3986_parser.rb:72:in `parse'
/Users/user/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/uri/common.rb:226:in `parse'
actionpack (3.1.0) lib/action_dispatch/routing/redirection.rb:91:in `block in redirection_proc'
rack-mount (0.8.3) lib/rack/mount/route_set.rb:152:in `call'
rack-mount (0.8.3) lib/rack/mount/route_set.rb:152:in `block in call'
...

问题是,我在点击任何控制器之前遇到此错误,所以我只是想知道在哪里可以捕获此错误来解析和修复URL?谢谢。

P.S:在指向我以前的任何帖子之前,请先查看堆栈跟踪。

1 个答案:

答案 0 :(得分:2)

根据RFC 3986,URI可能只包含ASCII字符的子集。

要提供有效的URI,应转义非ASCII字符:

irb(main):008:0> URI.parse "example.com/city/#{URI.encode('bergstraße')}"
=> #<URI::Generic example.com/city/bergstra%C3%9Fe>
  

问题是,我在点击任何控制器之前得到此错误,   所以我只是想知道在哪里可以捕获此错误来解析和修复   URL?

问题是你不应该抓住这个错误。您的rails服务器不应负责响应错误或格式错误的请求。

虽然您可以尝试编写一个中间件来解决问题,但您应该找出客户端发送无效URI请求的原因。

如果它们来自您自己的应用程序,请确保正确地转出slug列,而不仅仅是使用字符串插值创建url。 stringex宝石或friendly_id是您的朋友。