缘起

最近我把服务器的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

然后新建或打开sites文件夹
/etc/caddy
新建cdn.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}
        }

}
}

大功告成!
success


  • [1]:参考Caddy文档关于reverse_proxy语法的说明