【问题标题】:Set the a path containing [ ] on a URI在 URI 上设置包含 [ ] 的路径
【发布时间】:2013-05-20 08:05:43
【问题描述】:

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

【问题讨论】:

  • 是的,直接构建你的 URI。
  • 原来URI.escape 脑死了,不同意URI 关于需要编码的内容。它的来源是warn "#{caller(1)[0]}: warning: URI.escape is obsolete" if $VERBOSE,所以它显然已经过时并且不应该使用,但没有提到你应该使用什么。哇。您可以指定要编码的字符 (URI.escape("/test[1].png", '[]')),但您必须指定 所有字符。有CGI.escape,但它做的太多了。必须有一种理智的方法来完成这样一个简单的任务。

标签: ruby uri


【解决方案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 文字的分隔符之外。

【讨论】:

  • 不够。第二个参数替换默认替换集,因此您需要多个'[]' 才能涵盖所有情况。
【解决方案2】:

我建议为此使用 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。

【讨论】:

猜你喜欢
  • 2020-05-12
  • 2014-03-06
  • 2019-07-25
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 2014-03-03
  • 2017-08-02
相关资源
最近更新 更多