缘起
最近我把服务器的web server从nginx换到了Caddy2,(因为Caddy2真的太tm人性化了),但随之而来,我发现caddy反代的的语法和nginx差别似乎并不小,折腾了好久才搞好了图床的反代,故书此文以记之。
开始
⚠️注意:本文中所写的Caddy均指Caddy V2,V1与V2的语法存在较大差别,请留意!
准备工作
还是常规的任务,将域名解析到服务器
Caddy配置文件书写
1
打开Caddy配置文件目录,我的在/etc/caddy下,你可以直接编辑Caddyfile,也可以创建另一个文件将其引入到Caddyfile,我选择在sites文件夹下新建cdn.conf并将其引入
首先编辑Caddyfile,加入引用句段
1 | import /etc/caddy/sites/*.conf |
然后新建或打开sites文件夹

新建cdn.conf文件
2.编辑文件内容
1 | vim cdn.conf |
首先设定域名
1 | cdn.xxxxx.moe:443{ |
设置自动更新ssl证书
1 | cdn.xxxxx.moe:443 { |
我希望当别人直接访问cdn.xxxxx.moe时跳转到一个说明页面nyacdn.moe,而访问cdn.xxxxx.moe/pico/时则执行图床的反代。我需要使用handle语法,它类似nginx中的location指令。
因而语法结构如下
1 | cdn.xxxxx.moe:443 { |
接下来是反向代理的部分 由于语法不同,Caddy中不能像nginx一样直接用```proxy_pass```反代路径
上游地址不能包含路径或查询字符串,因为这将意味着在代理时同时重写请求,这种行为没有被定义或支持[1]
我本来想用rewrite的,但是折腾了很久之后我发现它并不适用,最后我发现了caddy还有uri这个语法,完美地实现了我的需要。
首先让cdn.xxxxx.moe/pico/反代https://cdn.jsdelivr.net
1 |
|
记得一定要加上header_up Host {upstream_hostport}否则jsdelivr会拦截
然后用uri改写url
1 | handle /pico/* { |
最后的配置文件长这样
1 | cdn.xxxxxx.moe:443 { |
回到Caddyfile所在目录,使用caddy validate检查配置文件是否有问题
没有问题的话使用caddy reload重载配置文件,或者重启caddy
大功告成!
