3

私は Sinatra を使用しており、get '/foo/:bar' {}メソッドを使用して URL からパラメーターを取得しています。残念ながら、 /に一致するルートがないため、 の値には 404 につながる:barような厄介なものが含まれている可能性があります。URLパラメーターをエスケープするために使用しますが、有効な文字と見なされます。ここで述べたように、これは、チェックするデフォルトの正規表現が安全でない文字と予約された文字を区別しないためです。これを変更したいと思い、これを行いました://foo/:bar/bazURI.escape/

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

それをテストするだけです。

URI::REGEXP::UNSAFERuby 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 に答える