什么是 "map" 在 Rack 中完全匹配?

What is "map" matching exactly in Rack?

假设我在机架中有这个:

map '/great' do
  run Test.new
end

这个 URL 很好用:site.com/great/stuff 但这个不行:site.com/greatstuff。我读到 map 应该匹配任何以参数名称开头的内容,但在像这样的情况下,情况似乎并非如此。

有详细的说明吗?

混淆似乎是概念上的。

它确实匹配从 /great 开始的 路径 。即/great/great//great/stuff等。 它不做的是匹配以 /great 开头的 strings。喜欢 /greatstuff.

/greatstuff/great是完全不同的路径。将路径视为树结构。


"string path matching" 没有办法用准系统 map AFAIK,但是你可以添加自己的机架中间件来查看请求路径和适当派遣。


如果你想仔细检查实现,这里有两个相关的地方:1, 2.

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

这基本上是从路径中创建一个正则表达式,该路径需要一个以该路径开头的字符串(忽略多个 /)才能匹配。又名:

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

如果您想知道,n 标志将编码设置为 ASCII。

如果字符串匹配,将执行更多检查。即匹配路径的其余部分是 non-existent 或以 / 开头。后者确保您不会将 /greatstuff/great 匹配,因为 stuff 不以 /.

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