缘起
最近我把服务器的web server从nginx换到了Caddy2,(因为Caddy2真的太tm人性化了),但随之而来,我发现caddy反代的的语法和nginx差别似乎并不小,折腾了好久才搞好了图床的反代,故书此文以记之。
开始
⚠️注意:本文中所写的Caddy均指Caddy V2,V1与V2的语法存在较大差别,请留意!
准备工作
还是常规的任务,将域名解析到服务器
Caddy配置文件书写
1
打开Caddy配置文件目录,我的在/etc/caddy下,你可以直接编辑Caddyfile,也可以创建另一个文件将其引入到Caddyfile,我选择在sites文件夹下新建cdn.conf并将其引入
首先编辑Caddyfile,加入引用句段
import /etc/caddy/sites/*.conf
2.编辑文件内容
vim cdn.conf
首先设定域名
cdn.xxxxx.moe:443{
}
设置自动更新ssl证书
cdn.xxxxx.moe:443 {
tls 233333@gmail.com #这里填你自己的邮箱
}
我希望当别人直接访问cdn.xxxxx.moe
时跳转到一个说明页面nyacdn.moe
,而访问cdn.xxxxx.moe/pico/
时则执行图床的反代。我需要使用handle语法,它类似nginx中的location
指令。
因而语法结构如下
cdn.xxxxx.moe:443 {
tls 233333@gmail.com
handle / {
redir https://nyacdn.moe permanent
}
handle /pico/* {
}
}
接下来是反向代理的部分
由于语法不同,Caddy中不能像nginx一样直接用
proxy_pass
反代路径
上游地址不能包含路径或查询字符串,因为这将意味着在代理时同时重写请求,这种行为没有被定义或支持[1]
我本来想用rewrite的,但是折腾了很久之后我发现它并不适用,最后我发现了caddy还有uri这个语法,完美地实现了我的需要。
首先让cdn.xxxxx.moe/pico/
反代https://cdn.jsdelivr.net
handle /pico/* {
reverse_proxy https://cdn.jsdelivr.net
header_up Host {upstream_hostport}
}
记得一定要加上header_up Host {upstream_hostport}
否则jsdelivr会拦截
然后用uri
改写url
handle /pico/* {
uri replace /pico/ /gh/xxxxx/pico/
reverse_proxy https://cdn.jsdelivr.net {
header_up Host {upstream_hostport}
}
}
最后的配置文件长这样
cdn.xxxxxx.moe:443 {
tls 233333@gmail.com
handle / {
redir https://nyacdn.moe permanent
}
handle /pico/* {
uri replace /pico/ /gh/xxxxx/pico/
reverse_proxy https://cdn.jsdelivr.net {
header_up Host {upstream_hostport}
}
}
}
[1]:参考Caddy文档关于reverse_proxy语法的说明