如何防止管道字符在Rails 3 / Ruby 1.9.2中导致错误的URI错误?

在我的应用程序中实现OAuth2时,我需要处理以下URI:

HTTP://本地主机:3000 /会话/创建/码= LOREM |存有

不确定它是否是Rails 3或Ruby 1.9.2问题(可能是URI.parse),但无论如何,WEBrick会启动Error bad URI

有人知道解决方法吗? 谢谢。

我最近遇到了同样的要求(和问题)。 在Rails 3和Ruby 1.9.2上。

这对我们的登台/制作环境(nginx)来说不是问题,但我有兴趣了解WEBrick的问题。 原来问题在于URI :: Parser.split方法,特别是它的模式匹配是如何用URI :: REGEXP :: PATTERN常量播种的。

您可以通过将以下内容添加到config / environments / development.rb来“修复”此问题(假设您只在开发中使用WEBrick ..或者您可以将其放在config / initializers文件中)。

 # this allows WEBrick to handle pipe symbols in query parameters URI::DEFAULT_PARSER = URI::Parser.new(:UNRESERVED => URI::REGEXP::PATTERN::UNRESERVED + '|') 

注意:那个设置:UNRESERVED =>“ – _。!〜*’()a-zA-Z \ d |”

初始化程序工作,但我最终使用URI.escape,因为它看起来更干净,看起来它将处理更多的情况。

 URI.join(origin_url, URI.escape(parsed_link)).to_s 

再加上这段代码似乎没有用

 # I need this because URI.join in crawler.rb bombs with '|' symbols old_verbose = $VERBOSE $VERBOSE = nil URI::DEFAULT_PARSER = URI::Parser.new(:UNRESERVED => URI::REGEXP::PATTERN::UNRESERVED + '|') $VERBOSE = old_verbose 

我最后只是换了Thin for WEBrick并没有遇到问题。