在URI上设置包含[]的路径

时间:2013-05-24 16:37:01

标签: ruby uri

您好我正在尝试使用URI来创建一个uri,但似乎不接受括号([]):

uri = URI.parse("http://example.com")
uri.path = URI.escape("/test[1].png")

URI::InvalidComponentError: bad component(expected absolute path component): /test[1].png
from /Users/something/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/uri/generic.rb:823:in `check_path'

任何想法怎么办?我应该不使用URI并在最后逃避uri吗?

2 个答案:

答案 0 :(得分:5)

我建议您使用Addressable::URI

虽然Ruby的内置URI很方便,但它显示出一些年龄的迹象,我怀疑这是一个。 Addressable :: URI已被提议作为URI的替代品,因为它符合当前的RFC并且功能更全面。

require 'addressable/uri'
Addressable::URI.parse("http://example.com/test[1].png")
=> #<Addressable::URI:0x81404710 URI:http://example.com/test[1].png>

Addressable::URI.parse("http://example.com/test[1].png").to_s
=> "http://example.com/test[1].png"

对于简单,通用,使用我使用URI,只是因为。对于繁重的工作,我使用Addressable :: URI。

答案 1 :(得分:1)

URI.escape采用其他参数(字符串或正则表达式,默认为REGEXP :: UNSAFE)来自定义要转义的字符。

试试这个:

uri = URI.parse("http://example.com")
uri.path = URI.escape("/test[1].png", "[]")

URI :: InvalidComponentError是因为URI中不允许使用方括号,但某些地方除外。见RFC 3986


3.2.2。宿主

&LT; ...&GT;

由Internet协议文字地址(版本6 [RFC3513]或更高版本)标识的主机通过将IP文本括在方括号(“[”和“]”)中来区分。 这是URI语法中唯一允许使用方括号字符的地方。


附录D. RFC 2396的变更

D.1。添加

&LT; ...&GT; 方括号现在在权限组件中指定为保留,不允许在其用作主机内IP字的分隔符之外。