2017-01-27 2 views
1

말은 내가 랙이 있습니다 site.com/great/stuff하지만이되지 않습니다 :랙에서 정확히 일치하는 "맵"은 무엇입니까?

map '/great' do 
    run Test.new 
end 

이 URL은 위대한 작동 site.com/greatstuff을. 나는 map이 arg 이름으로 시작하는 것과 일치해야한다고 읽었지만, 이것과 같은 경우에는 그렇지 않습니다.

작동 방식에 대한 자세한 사양이 있습니까?

+0

확실하지 않지만 '/ 위대한 /'과 모든/위대한/'하위 폴더와 일치한다고 말할 수 있습니다. 단지 'great'로 시작하는 경로와 일치하지 않습니다. –

+0

그래, 네 말이 맞아. 문서가 정말 가난 하네. 일치하는 정규식이 여기에 있습니다. https://github.com/rack/rack/blob/master/lib/rack/urlmap.rb – Anthony

답변

5

혼란은 개념적 인 것처럼 보입니다.

이 일치에게 경로 /great로 시작 않습니다. 즉, /great, /great/, /great/stuff 등입니다. 일치하지 않는 내용은 문자열으로 시작하여 /great으로 시작합니다. /greatstuff처럼.

/greatstuff/great은 완전히 다른 경로입니다. 경로를 나무 구조로 생각하십시오.


는 베어 map AFAIK으로을 "일치 문자열 경로를"할 수있는 방법이 없습니다,하지만 당신은 요청 경로를 살펴보고 적절하게 전달 자신의 랙 미들웨어를 추가 할 수 있습니다. 1, 2 :


여기, 이행을 재확인하려면

는 두 개의 관련 장소입니다.

Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", nil, 'n') 

이것은 기본적으로 일치하기 위해 해당 경로 (무시 여러 /)로 시작하는 문자열을 필요로하는 경로에서 정규식을 만듭니다. 아카 : 당신이 궁금해하는 경우

to_regex('/foo/bar') # => /^\/+foo\/+bar(.*)/n 

n 플래그는 ASCII로 인코딩을 설정합니다.

문자열이 일치하면 몇 가지 검사가 수행됩니다. 즉, 일치하는 경로의 나머지는 존재하지 않거나 /으로 시작합니다. 후자는 stuff/으로 시작하지 않기 때문에 /greatstuff/great을 일치시키지 않습니다.

next unless !rest || rest.empty? || rest[0] == ?/ 
+0

관련 문서를 찾았습니까? 그게 내 결론 이었지만, 나는 소스 코드를 보는데 신경 쓰지 않았다. –

+1

@EricDuminil, 구현 참조를 추가했습니다. – ndn

관련 문제