惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
博客园 - 聂微东
雷峰网
雷峰网
Microsoft Azure Blog
Microsoft Azure Blog
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
S
SegmentFault 最新的问题
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
博客园 - 三生石上(FineUI控件)
V
Visual Studio Blog
博客园 - 司徒正美
爱范儿
爱范儿
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
博客园_首页
博客园 - 【当耐特】
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
人人都是产品经理
人人都是产品经理
V
V2EX

竹林里有冰的博客

Nuxt SSG 博客的尾斜杠到底怎么加? | 竹林里有冰的博客 小米 Xiaomi Book Pro 14 (Ultra X7) Linux 兼容性实测 | 竹林里有冰的博客 国内(大陆)版小米 FCM 熄屏断连:Rootless 环境下的尝试与可能的解决方案 | 竹林里有冰的博客 我没法访问 dl.google.com —— 记一次 TUN 下的网络 debug | 竹林里有冰的博客 Vercel 的缓存控制,你注意过吗? | 竹林里有冰的博客 小记 —— Caddy 在 Layer 4 上的流量代理实践 | 竹林里有冰的博客 你的域名后缀拖慢你的网站速度了嘛?——再谈 DNS 冷启动 | 竹林里有冰的博客 DNS 冷启动:小型站点的“西西弗斯之石” | 竹林里有冰的博客 HTTP/2 Server Push 已事实性“死亡”,我很怀念它 | 竹林里有冰的博客 Nuxt Content v3 中数组字段的筛选困境与性能优化 | 竹林里有冰的博客 后 OCSP 时代,浏览器如何应对证书吊销新挑战 | 竹林里有冰的博客 初试 Github Action Self-hosted Runner,想说爱你不容易 | 竹林里有冰的博客 DNS 解析延迟毁了我的图床优化 | 竹林里有冰的博客 Vue Markdown 渲染优化实战(下):告别 DOM 操作,拥抱 AST 与函数式渲染 | 竹林里有冰的博客 Vue Markdown 渲染优化实战(上):从暴力刷新、分块更新到 Morphdom 的华丽变身 | 竹林里有冰的博客 node-sass 迁移至 dart-sass 踩坑实录 | 竹林里有冰的博客 前端中的量子力学——一打开 F12 就消失的 Bug | 竹林里有冰的博客 2025 年,如何为 web 页面上展示的视频选择合适的压缩算法? | 竹林里有冰的博客 el-image 和 el-table 怎么就打架了?Stacking Context 是什么? | 竹林里有冰的博客 2025年,前端如何使用 JS 将文本复制到剪切板? | 竹林里有冰的博客 ssh 拯救世界——通过 ssh 隧道在内网服务器执行 APT 更新 | 竹林里有冰的博客 Cudy TR3000 吃鹅(daed)记 | 竹林里有冰的博客 使用 Cloudflare Workers 监控 Fedora Copr 构建状态 | 竹林里有冰的博客 基于 Cloudflare Workers 实现的在线服务状态检测告警系统 | 竹林里有冰的博客 构建部署在 Cloudflare Workers 上的 TG Bot | 竹林里有冰的博客 2024年,Firefox 是唯一还在坚持执行在线的 SSL 证书吊销状态检查的主流浏览器 | 竹林里有冰的博客 小爱课程表适配不完全指北——以 ZJUT 本科正方教务系统为例 | 竹林里有冰的博客 将博客从 waline v2 更新到 waline v3 | 竹林里有冰的博客 给家里云装上 Fedora 41 KDE 后,我是如何配置的 | 竹林里有冰的博客 为 Hexo 添加 follow 认证 | 竹林里有冰的博客
使用caddy反向代理维基百科中文站点 | 竹林里有冰的博客
竹林里有冰 · 2022-05-30 · via 竹林里有冰的博客

反代的目的无非是两点

  • 满足自己在无代理情况下访问无法访问的站点的需求
  • 方便将站点分享给亲朋好友。

一直以来,我都想用 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 进行存档,如有无法访问的情况,请自行前往存档站获取历史存档。