很多时候想在中文维基百科上查一些词条,但是又不方便开VPN,配置一个自用的反向代理还是不错的选择。

Caddy 是一个用 Golang 开发的 web server,自动申请并配置 Let's Encrypt 证书的功能是其最大亮点,所以我决定在 Caddy 上配置我的 Wikipedia 反向代理。

首先,需要在 Caddy 的官网下载并安装 Caddy server,注意务必要勾选 http.filter 这个插件,不然我们的反向代理无法对页面的内容进行链接的过滤和替换。

Caddy 的配置非常简单,无需多言,我就在这里贴一下我用来代理 Wikipedia 的配置:

首先是主站的配置,使用 http.filter 插件把所有的 zh.wikipedia.org 链接都替换成 wiki.example.com ,此外,还需要把所有 / 的请求都301重定向到 /wiki/Wikipedia:首页 ,不然会自动跳转回 zh.wikipedia.org

wiki.example.com {
    gzip
    proxy / https://zh.wikipedia.org {
        header_upstream X-Real-IP {remote}
        header_upstream User-Agent {>User-Agent}
        header_upstream Accept-Encoding identity
    }
    redir 301 {
        if {path} is /
        /wiki/Wikipedia:首页
    }
    filter rule {
        content_type text/.*
        search_pattern zh.wikipedia.org
        replacement wiki.example.com
    }
    filter rule {
        content_type text/.*
        search_pattern zh.m.wikipedia.org
        replacement m.wiki.example.com
    }
    filter rule {
        content_type text/.*
        search_pattern upload.wikimedia.org
        replacement up.wiki.example.com
    }
}

 

如果用手机浏览器访问,会跳转到手机版网页,因此也需要做同样的替换。

m.wiki.example.com {
    gzip
    proxy / https://zh.m.wikipedia.org {
        header_upstream X-Real-IP {remote}
        header_upstream User-Agent {>User-Agent}
        header_upstream Accept-Encoding identity
    }
    redir 301 {
        if {path} is /
        /wiki/Wikipedia:首页
    }
    filter rule {
        content_type text/.*
        search_pattern zh.wikipedia.org
        replacement wiki.example.com
    }
    filter rule {
        content_type text/.*
        search_pattern zh.m.wikipedia.org
        replacement m.wiki.example.com
    }
    filter rule {
        content_type text/.*
        search_pattern upload.wikimedia.org
        replacement up.wiki.example.com
    }
}

 

顺便也给媒体资源做一个反向代理。

up.wiki.example.com {
    gzip
    proxy / https://upload.wikimedia.org {
        header_upstream X-Real-IP {remote}
        header_upstream User-Agent {>User-Agent}
    }
}

 

DNS配置:

不管是 wiki.example.com 还是 m.wiki.example.com 还是 up.wiki.example.com 都需要添加A记录指向 Caddy 所在的服务器IP,Caddy启动后会自动对各个域名解析进行验证并向 Let's Encrypt 申请并配置 TLS 证书,完全不用考虑如何配置 TLS 证书。

已知问题:

搜索不可用,因为 Wikipedia 的搜索有时候会触发到目的词条的 302 重定向,而 302 响应的 header 中的 location 字段目前无法通过 http.filter 插件进行查找和替换,因此仍然会跳转到 zh.wikipedia.org

另外,目前我只配置了中文维基百科的反向代理,毕竟英文版的还能访问不是么。

via.https://ichon.me/post/1026.html