如何在 app.yaml 中使用正则表达式处理虚拟子目录?

How can I handle virtual subdirectories with regex in app.yaml?

我想将 "single subdirectories" 的所有访问者指向一个页面,将 "double subdirectories" 的所有访问者指向另一个页面。例如:

/foo/
/new/
/north/
/1-j4/

会全部指向1.app,而

/foo/bar/
/new/york/
/north/west/
/1-j4/a_990/

都会指向2.app。

我想我可以用非贪婪的正则表达式匹配来做到这一点,就像这样:

- url: /(.*?)/$
  script: 1.app

- url: /(.*?)/(.*?)/$
  script: 2.app

令我困惑的是,/foo/ 和 /foo/bar/ 都解析为脚本 1.app。 "lazy" 正则表达式是否强制自己包含中间的 /,因为这是获得匹配的唯一方法?我还能怎么做?我试过使用 (\w*?) 但得到了相同的结果。

.*? 仍将匹配任意数量的 /,因为 . 匹配除换行符以外的任何字符(默认情况下)。您需要将正则表达式基于否定字符 class、[^/]*,匹配 /.

以外的 0 个或更多字符

要将目录与一个部分匹配,请使用 ^([^/]*)/?$,要将目录与两个部分匹配,请使用 ^([^/]*)/([^/]*)/?$

请注意,如果您计划在在线 Web 测试器中使用这些模式,则必须在大多数模式中转义 /,因为默认情况下它们使用 / 符号作为正则表达式分隔符。

是的,(.*?) 包含斜杠,因此将解析为 1.app。如果你把 2.app 处理程序放在第一位,它应该会做你想做的事:

- url: /(.*?)/(.*?)/$
  script: 2.app

- url: /(.*?)/$
  script: 1.app