4

我正在尝试使用 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 吗?

4

2 回答 2

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。

于 2013-05-24T17:33:10.020 回答
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. 主持人

<...>

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


附录 D. 对 RFC 2396 的更改

D.1。加法

<...>方括号现在在授权组件中被指定为保留,并且不允许在它们用作主机内 IP 文字的分隔符之外。

于 2013-05-24T17:34:29.133 回答