当你的站是一个静态网站时,并且网站中有接口请求时,可能会出现跨域问题。那解决该问题的大部分的办法就是使用一个服务器做代理转发。
所以说到这就知道,还需要一个服务器,即:要花钱。那有什么办法吗?
说出来了当然有。
前提
使用 vercel 托管你的静态网站。
开始配置
1. vercel.json
在你的项目根目录创建一个 vercel.json 文件,内容如下:
{
"rewrites": [
{
"source": "/notion-api/(.*)",
"destination": "/api/proxy"
}
]
}
•source:不直接请求接口地址,而是按照 source 格式的方式访问,该格式自己定义。•destination:将 source 匹配到的 url 转发到 destination 地址上。
2. destination
这个地址是在 vercel 上启动一个常驻服务生成的。
在项目根目录创建一个 api/proxy.js 路径的文件,按照这个路径要求来,该文件的内容如下:
// req:请求
// res:响应
module.exports = (req, res) => {
// ...
}
然后在这个函数体内可以自己编写请求的转发。
看看我的写过的一个例子,用来转发 Notion API 接口。
完整例子:
const request = require('request');
module.exports = (req, res) => {
// proxy middleware options
let prefix = "/notion-api"
if (!req.url.startsWith(prefix)) {
return;
}
let target = "https://api.notion.com" + req.url.substring(prefix.length);
var options = {
'method': 'GET',
'url': target,
'headers': {
'Notion-Version': res.headers['notion-version'],
'Authorization': res.headers['authorization']
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
res.writeHead(200, {"Content-Type": "application/json"});
res.write(response.body);
res.end();
});
}
该例子,就是从 req 参数里获取想要的数据,然后使用 request 发放进行转发。
2. Functions
写好后,如何运行这个文件呢?
在 Vercel 后台找到 Functions 这个功能板块,如果上面的配置没有问题,并且已经重新部署,那么就会出现如下图:
配置好后,就可以测试了。
假如我的静态网站在 Vercel 上的地址是 https://laomiao.site,那么根据 version.json 文件中的配置访问:
https://laomiao.site/notion-api/xxxxxxx
成功后会在 Functions 页面出现访问日志,如果没有那就说明有问题。
总结
我捋下流程。