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 个选择:
- 使用路线:
route /api/* {
file_server
reverse_proxy localhost:9000
}
order
使用全局选项更改默认顺序handle
与file_server
之前一起使用reverse_proxy
答案2
根据我的理解和经验,更具体的考虑比更通用的考虑更值得考虑。
例如在您的情况下,任何与 /API/ 匹配的内容都应转发到节点,其他任何内容都应转发到普通网络服务器。
无论如何,只要 /api/ 不是网站上的实际文件夹,访问网站的请求就无关紧要