2013-02-20 1 views
3

나는 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

Ruby 1.9.3 Documentaton에 따라에 맞게 기본 정규 표현식이다 .삼. 불행히도, URI 모듈 문서는 일반적으로 좋지 않지만, 실제로 이것을 이해할 수는 없습니다. 어떤 힌트?

미리 감사드립니다.

+0

조금 혼란 스럽습니다. 클라이언트가 예약 문자를 포함하는 요청을 리터럴 문자로 발행해야하는 경우 백분율로 인코딩하여 보내야합니다. 즉': bar' *는'/'대신'% 2F'를 포함하는 sinatra 서버로 보내야합니다. sinatra 서버가 인코딩 할 수있는 방법은 없습니다. – pje

+0

그러나 클라이언트는 sinatra 서버에 의해 _rendered_ 인 템플릿에서': bar '를 보내고, URL을 이스케이프 처리합니다. 또한 나는 [/? search = bar]에서 [description] (http://stackoverflow.com/questions/14657074/)와 같이/search/# {params [: bar]}로 리디렉션합니다. – Ps0ke

답변

9

URI#escape이 (가) 찾고있는 것이 아닙니다. 당신은 CGI#escape를 원하는 :

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

이 제대로은시나가 그것을 검색 할 수 있도록 인코딩됩니다.

+0

대단히 고마워,이게 내 문제를 해결해. URI 모듈은 어쨌든 사용되지 않습니까? – Ps0ke

+0

아니요, 더 이상 사용되지 않습니다. 조금 다르게 작동합니다. 그것은 다른 목적을위한 것입니다. –

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"