折腾使用Caddy反向代理jsdelivr

缘起

最近我把服务器的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文件夹
/etc/caddy
新建cdn.conf文件

2.编辑文件内容

1
vim cdn.conf

首先设定域名

1
2
3
cdn.xxxxx.moe:443{

}

设置自动更新ssl证书

1
2
3
4
cdn.xxxxx.moe:443 {
tls 233333@gmail.com #这里填你自己的邮箱
}


我希望当别人直接访问cdn.xxxxx.moe时跳转到一个说明页面nyacdn.moe,而访问cdn.xxxxx.moe/pico/时则执行图床的反代。我需要使用handle语法,它类似nginx中的location指令。

因而语法结构如下

1
2
3
4
5
6
7
8
9
10
11
12
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

1
2
3
4
5
6

handle /pico/* {
reverse_proxy https://cdn.jsdelivr.net
header_up Host {upstream_hostport}
}

记得一定要加上header_up Host {upstream_hostport}否则jsdelivr会拦截

然后用uri改写url

1
2
3
4
5
6
handle /pico/* {
uri replace /pico/ /gh/xxxxx/pico/
reverse_proxy https://cdn.jsdelivr.net {
header_up Host {upstream_hostport}
}
}

最后的配置文件长这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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}
}

}
}

回到Caddyfile所在目录,使用caddy validate检查配置文件是否有问题

没有问题的话使用caddy reload重载配置文件,或者重启caddy

大功告成!
success

  • [1]:[参考Caddy文档关于reverse_proxy语法的说明](https://caddy2.dengxiaolong.com/docs/caddyfile/directives/reverse_proxy)
  • 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

    Next Post

    如何解决chrome自带翻译无法使用的问题(非一般的改hosts/魔法上网)