3

我正在使用 Sinatra 并使用该get '/foo/:bar' {}方法从 url 获取参数。不幸的是,in 中的值:bar可能包含一些讨厌的东西,比如/导致 404,因为没有路由匹配/foo/:bar/baz/。我URI.escape用来转义 URL 参数,但它认为/valid 是一个有效字符。正如这里提到的,这是因为要检查的默认正则表达式不区分不安全字符和保留字符。我想改变它并这样做:

URI.escape("foo_<_>_&_3_#_/_+_%_bar", Regexp.union(URI::REGEXP::UNSAFE, '/'))

只是为了测试它。

URI::REGEXP::UNSAFE是根据Ruby 1.9.3 Documentaton匹配的默认正则表达式:

escape(*arg)
Synopsis
    URI.escape(str [, unsafe])

Args
    str
        String to replaces in.
    unsafe
        Regexp that matches all symbols that must be replaced with
        codes. By default uses REGEXP::UNSAFE. When this argument is
        a String, it represents a character set.
Description
    Escapes the string, replacing all unsafe characters with codes.

不幸的是,我收到此错误:

uninitialized constant URI::REGEXP::UNSAFE

正如这个 GitHub 问题所暗示的,这个 Regexp 已从 1.9.3 的 Ruby 中删除。不幸的是,URI模块文档通常有点糟糕,但我真的无法弄清楚这一点。有什么提示吗?

提前致谢!

4

2 回答 2

9

URI#escape不是您要查找的内容。你想要CGI#escape

require 'cgi'
CGI.escape("foo_<_>_&_3_#_/_+_%_bar")
# => "foo_%3C_%3E_%26_3_%23_%2F_%2B_%25_bar"

这将正确地对其进行编码以允许 Sinatra 检索它。

于 2013-02-20T23:36:33.083 回答
2

也许你会有更好的运气CGI.escape

>> require 'uri'; URI.escape("foo_<_>_&_3_#_/_+_%_bar")
=> "foo_%3C_%3E_&_3_%23_/_+_%25_bar"
>> require 'cgi'; CGI.escape("foo_<_>_&_3_#_/_+_%_bar")
=> "foo_%3C_%3E_%26_3_%23_%2F_%2B_%25_bar"
于 2013-02-20T23:34:26.650 回答