说我在Rack中有这个:
map '/great' do
run Test.new
end
此网址效果很好:site.com/great/stuff
但不是:site.com/greatstuff
。我已经读过map
应该匹配任何与arg名称一起出现的东西,但是这种情况似乎并非如此。
是否有关于其工作原理的详细说明?
答案 0 :(得分:6)
混乱似乎是概念性的。
它与/great
开头的 路径 匹配。那是/great
,/great/
,/great/stuff
等等。
它没有做的是从/great
开始匹配 字符串 。与/greatstuff
一样。
/greatstuff
和/great
是完全不同的路径。将路径视为树结构。
无法与准系统map
AFAIK进行“字符串路径匹配”,但您可以添加自己的机架中间件,查看请求路径并进行相应的调度。
Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", nil, 'n')
这基本上创建了一个路径的正则表达式,该路径需要一个字符串以该路径开始(忽略多个/
)才能匹配。又名:
to_regex('/foo/bar') # => /^\/+foo\/+bar(.*)/n
如果您想知道,n
标志将编码设置为ASCII。
如果字符串匹配,则执行更多检查。即,匹配路径的其余部分要么不存在,要么以/
开头。后者可确保您不会将/greatstuff
与/great
匹配,因为stuff
不会以/
开头。
next unless !rest || rest.empty? || rest[0] == ?/