什么是 "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,但是你可以添加自己的机架中间件来查看请求路径和适当派遣。
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] == ?/
假设我在机架中有这个:
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,但是你可以添加自己的机架中间件来查看请求路径和适当派遣。
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] == ?/