말은 내가 랙이 있습니다 site.com/great/stuff
하지만이되지 않습니다 :랙에서 정확히 일치하는 "맵"은 무엇입니까?
map '/great' do
run Test.new
end
이 URL은 위대한 작동 site.com/greatstuff
을. 나는 map
이 arg 이름으로 시작하는 것과 일치해야한다고 읽었지만, 이것과 같은 경우에는 그렇지 않습니다.
작동 방식에 대한 자세한 사양이 있습니까?
말은 내가 랙이 있습니다 site.com/great/stuff
하지만이되지 않습니다 :랙에서 정확히 일치하는 "맵"은 무엇입니까?
map '/great' do
run Test.new
end
이 URL은 위대한 작동 site.com/greatstuff
을. 나는 map
이 arg 이름으로 시작하는 것과 일치해야한다고 읽었지만, 이것과 같은 경우에는 그렇지 않습니다.
작동 방식에 대한 자세한 사양이 있습니까?
혼란은 개념적 인 것처럼 보입니다.
이 일치에게 경로 /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] == ?/
관련 문서를 찾았습니까? 그게 내 결론 이었지만, 나는 소스 코드를 보는데 신경 쓰지 않았다. –
@EricDuminil, 구현 참조를 추가했습니다. – ndn
확실하지 않지만 '/ 위대한 /'과 모든/위대한/'하위 폴더와 일치한다고 말할 수 있습니다. 단지 'great'로 시작하는 경로와 일치하지 않습니다. –
그래, 네 말이 맞아. 문서가 정말 가난 하네. 일치하는 정규식이 여기에 있습니다. https://github.com/rack/rack/blob/master/lib/rack/urlmap.rb – Anthony