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
将同时匹配 thefile_server *
和reverse_proxy /api/*
匹配器,因此不清楚该请求是转到文件系统还是 Node.js 进程。
我在 Caddy 2 文档中找不到任何描述应该发生什么的内容。在我自己的测试中,结果似乎取决于指令在文件中出现的顺序,较早的条目“获胜”。应该发生什么?如果它是“未定义的行为”,是否有更好的方法来编写此文件以避免歧义?
在我的理解和经验
reverse_proxy
中优先,因为指令具有默认的隐式顺序:https ://caddyserver.com/docs/caddyfile/directives#directive-order 。要强制执行不同的订单,您至少有 3 个选项:
order
使用全局选项更改默认顺序handle
与file_server
之前一起使用reverse_proxy
根据我的理解和经验,更具体的考虑比更通用的。
例如,在您的情况下,任何匹配 /API/ 的东西都应该转发到节点,而其他任何东西都应该转发到普通的网络服务器。
无论如何,只要 /api/ 不是网站上的实际文件夹,访问网站的请求就无关紧要
另请参阅:https ://caddyserver.com/docs/caddyfile/directives/root