使用Vercel反代Leancloud国际版api以避免屏蔽
情况描述
我用的Hexo主题为Fluid,它内置了用leancloud实现的UV统计功能。作为一位完全不想备案,想方设法逃避的博主,我当然不会选择leancloud国内版,国际版才是最优选!
然而,由于手机和电脑分流规则皆是“漏网之鱼”指向了代理,我也没有专门为我的网站设立规则,我一直没发现一个问题:通过大陆ip访问博客时,leancloud的api会拒绝连接!1
我分配到的leancloud api地址是ewtbugjp.api.lncldglobal.com,大陆直连时服务器会拒绝连接,其他地方访问才会出现404的返回。
不知道这是什么情况,我Google了好一会儿也没找到原因,没有任何人报告出现此问题。唉,无论是否是特例,我都得修好这个bug!
解决方法
思路
既然直连不行,还有种方法叫“反代2”。通过一个不在大陆的服务器去反代这个api,是否就能躲开leancloud国际版对于大陆ip的屏蔽?
可是我的整套个人网站都是Serverless的,不存在后端去代理啊?🤔
事实上,serverless服务也可以作为反代服务器!有很多种办法达成目的。考虑到我现在主博客采用的Vercel部署,且延迟优秀、速度快,自然就想到了用Vercel来反代。
当然,Cloudflarr Worker也可以达到类似效果。教程可以在Google上面搜一下,估计一大堆。
一. Vercel反代
首先,你得有一个Vercel的帐号。
这不是废话嘛
其次,你得有一个终端环境。推荐bash或zsh。
1. 安装Vercel CLI
通过Debian系的sudo apt install npm
或CentOS系的sudo yum install npm
安装npm包管理器。
安装完成后,使用npm i -g vercel
以安装Vercel CLI。
2. 登陆Vercel CLI
vercel login
这个过程中有很多种登录方式,这里就不细说了,看着英文指导来就可以。
3. 创建反代文件
新建一个文件夹当作部署的根目录,在文件夹下随便创建一个json文件。我的是ewtbugjp.api.lncldglobal.com.json
在json文件内写入
{
"version": 2,
"routes": [
{"src": "/(.*)","dest": "https://ewtbugjp.api.lncldglobal.com/$1"}
]
}
上面的https://ewtbugjp.api.lncldglobal.com
是我的api地址。可以在leancloud项目后台找到替换上去,或者通过appid获取:
https://app-router.leancloud.cn/2/route?appId=
将appid添加到上述地址后面访问,即可看到json格式的返回,其中最后一个api_server
的值即为你的api服务器域名。
4. 部署
准备好反代文件后,就可以部署了。
vercel -A ewtbugjp.api.lncldglobal.com.json --prod
上面命令中的json文件名记得改为你记得的。
5. 获取部署域名
访问vercel,找到你刚刚部署的项目后,可以选择在设置中通过A记录或CNAME添加域名,也可以直接用vercel提供的域名。
记录下这个域名,我们开始替换leancloud.js
内的地址。
二. 替换leancloud地址
以Fluid主题内的leancloud.js
为例。
1. 找到leancloud.js
使用npm包安装、在vps或云服务器上运行的Hexo中,leancloud.js文件是node_modules/hexo-theme-fluid/source/js/leancloud.js
使用releases安装在themes文件夹,则leancloud.js是themes/fluid/source/js/leancloud.js
2. 修改server_url
脚本内大约180多行处,有一处代码如下:
var apiServer = serverUrl || `https://${appId.slice(0, 8).toLowerCase()}.api.lncldglobal.com`;
将其改为:
var apiServer = serverUrl || `https://leancloud.proxy.com`;
当然,此处的https://leancloud.proxy.com
应该修改为你自己的反代网址。
推送部署后,你的api应该就能全球访问了。此行为不会影响“浏览人数”的数据。