反代的目的无非是两点
- 满足自己在无代理情况下访问无法访问的站点的需求
- 方便将站点分享给亲朋好友。
一直以来,我都想用 caddy 去反代一份维基百科来用,今天刚好就顺手解决了。
注意事项
- 用于反代的机子需要有对目标站点的访问能力
- 最好准备一个新的域名作为白手套,防止被污染
- 建议增加密码保护,一来使得小鸡流量不被滥用,二来防止防火墙检测到站点内容
- 本文使用的 caddy 开启了
replace_response插件,可以使用xcaddy编译或直接前往 https://caddyserver.com/download 勾选相应插件后下载。安装时,建议先根据官方文档安装原版 caddy,再用启用了replace_response插件的 caddy 二进制文件覆盖掉原版 caddy,这样就不需要去手写 systemd 相关的文件了。
Caddyfile
{
order replace after encode
}
https://zhwiki.example.com {
reverse_proxy * https://zh.wikipedia.org {
header_up Host {upstream_hostport}
header_up X-Real-IP {http.request.remote.host}
header_up X-Forwarded-For {http.request.remote.host}
header_up X-Forwarded-Port {http.request.port}
header_up X-Forwarded-Proto {http.request.scheme}
header_up Accept-Encoding identity
header_down location (https://zh.wikipedia.org/)(.*) https://zhwiki.example.com/$2
header_down location (https://zh.m.wikipedia.org/)(.*) http://m.zhwiki.example.com/$2
}
replace {
"upload.wikimedia.org" "up.zhwiki.example.com"
"zh.wikipedia.org" "zhwiki.example.com"
"zh.m.wikipedia.org" "m.zhwiki.example.com"
}
}
https://m.zhwiki.example.com {
reverse_proxy * https://zh.m.wikipedia.org {
header_up Host {upstream_hostport}
header_up X-Real-IP {http.request.remote.host}
header_up X-Forwarded-For {http.request.remote.host}
header_up X-Forwarded-Port {http.request.port}
header_up X-Forwarded-Proto {http.request.scheme}
header_up Accept-Encoding identity
header_down location (https://zh.wikipedia.org/)(.*) https://zhwiki.example.com/$2
header_down location (https://zh.m.wikipedia.org/)(.*) http://m.zhwiki.example.com/$2
}
replace {
"upload.wikimedia.org" "up.zhwiki.example.com"
"zh.wikipedia.org" "zhwiki.example.com"
"zh.m.wikipedia.org" "m.zhwiki.example.com"
}
}
https://up.zhwiki.example.com {
reverse_proxy * https://upload.wikimedia.org {
header_up Host {upstream_hostport}
header_up X-Real-IP {http.request.remote.host}
header_up X-Forwarded-For {http.request.remote.host}
header_up X-Forwarded-Port {http.request.port}
header_up X-Forwarded-Proto {http.request.scheme}
header_up Accept-Encoding identity
}
}
简单解释
第一大段是启用 replace_response 插件的部分,直接照抄即可。
第二和第三大段的思路是一致的,分别反向代理了 PC 端和移动段的网页。两行 header_down 的写法是受到了知乎上那篇 Github 反代的启发,避免了源站发出 302 重定向时访客被带到源站去。replace 部分不用多说,就是将针对三个源站域名的请求改到反代站域名。
第四大段就是中规中举地反代了 upload.wikimedia.org 这个域名,上面存放的大多数是媒体文件,如果条件允许的话其实可以考虑使用多个服务器反代。
密码保护在我这份 Caddyfile 中没有启用,如果有需要的话可以参考我的另一篇博客。
参考资料
Caddy 官方文档The Road to Serfdom——如何为GitHub搭建反向代理使用 Caddy 配置 Wikipedia 反向代理使用 Caddy 反代 ghcr.io
所有参考资料除官方文档外均使用 web.archive.org 和 archive.ph 进行存档,如有无法访问的情况,请自行前往存档站获取历史存档。