您好我正在尝试使用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吗?
答案 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字的分隔符之外。