나는 Sinatra를 사용하고 get '/foo/:bar' {}
메서드를 사용하여 URL에서 매개 변수를 가져옵니다. 죄송하지만 :bar
의 값은 /foo/:bar/baz
/과 일치하지 않으므로 /
과 같은 불쾌한 것이 404까지 이어질 수 있습니다. URI.escape
을 사용하여 URL 매개 변수를 이스케이프 처리하지만, /
은 유효한 문자로 간주됩니다. 그것이 언급 된대로 here 이것은 대조 할 기본 Regexp가 안전하지 않은 문자와 예약 된 문자를 구분하지 않기 때문입니다. 이를 변경하고 싶습니다.Ruby 1.9.3 URI.escape에 안전하지 않은 문자 추가
URI.escape("foo_<_>_&_3_#_/_+_%_bar", Regexp.union(URI::REGEXP::UNSAFE, '/'))
테스트하기 만하면됩니다. this GitHub Issue에서 알 수 있듯이
uninitialized constant URI::REGEXP::UNSAFE
그리고,이 정규 표현식은 1.9과 루비에서 제거 : Unfortunatelly 난이 오류가
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.
:
URI::REGEXP::UNSAFE
URI
모듈 문서는 일반적으로 좋지 않지만, 실제로 이것을 이해할 수는 없습니다. 어떤 힌트?
미리 감사드립니다.
조금 혼란 스럽습니다. 클라이언트가 예약 문자를 포함하는 요청을 리터럴 문자로 발행해야하는 경우 백분율로 인코딩하여 보내야합니다. 즉': bar' *는'/'대신'% 2F'를 포함하는 sinatra 서버로 보내야합니다. sinatra 서버가 인코딩 할 수있는 방법은 없습니다. – pje
그러나 클라이언트는 sinatra 서버에 의해 _rendered_ 인 템플릿에서': bar '를 보내고, URL을 이스케이프 처리합니다. 또한 나는 [/? search = bar]에서 [description] (http://stackoverflow.com/questions/14657074/)와 같이/search/# {params [: bar]}로 리디렉션합니다. – Ps0ke