当发生冲突时,Caddy 会选择哪个匹配器?

当发生冲突时,Caddy 会选择哪个匹配器?

Caddyfile 中的指令可以有“匹配器”,将其限制为特定请求。这让 Caddy 2 可以为不同的路径提供不同的内容,但如果多个指令匹配同一个请求,会发生什么情况?

如果我想使用 Caddy 2 提供一个几乎静态的网站,但将某个/api/区域转发到某个 Node.js 进程,我的 Caddyfile 可能看起来像这样:

fake-example.edge.app {
  root * /var/www/example
  reverse_proxy /api/* localhost:9000
  file_server *
}

到 的请求将与和匹配器/api/user都匹配,因此不清楚该请求是转到文件系统还是 Node.js 进程。file_server *reverse_proxy /api/*

我在 Caddy 2 文档中找不到任何描述应该发生什么的内容。在我自己的测试中,结果似乎取决于指令在文件中出现的顺序,较早的条目“获胜”。应该发生什么?如果这是“未定义的行为”,有没有更好的方法来编写此文件以避免歧义?

答案1

根据我的理解和经验,reverse_proxy优先是因为指令具有默认的隐式顺序:https://caddyserver.com/docs/caddyfile/directives#directive-order

要强制执行不同的顺序,您至少有 3 个选择:

  1. 使用路线:
    route /api/* {
      file_server
      reverse_proxy localhost:9000
    }
  1. order使用全局选项更改默认顺序
  2. handlefile_server之前一起使用reverse_proxy

答案2

根据我的理解和经验,更具体的考虑比更通用的考虑更值得考虑。

例如在您的情况下,任何与 /API/ 匹配的内容都应转发到节点,其他任何内容都应转发到普通网络服务器。

无论如何,只要 /api/ 不是网站上的实际文件夹,访问网站的请求就无关紧要

另请参阅:https://caddyserver.com/docs/caddyfile/directives/root

相关内容