使用函数计算实现 301 重定向

旧域名 oyohyee.com 因为更新备案信息太麻烦,所以取消了备案。在开会期间严查导致原有 CDN 失效,因此一段时间内处于不可用状态。
期望上 xxx.oyohyee.com 直接无脑 301 跳到 xxx.ohyee.cc 即可,但是国内云厂商 DNS 显式域名转发(301)也需要备案……

所以考虑自己跑一个服务来解决。
因为需要很简单,不需要存储数据、对性能消耗极小(无脑返回字符串),因此使用 函数计算 即可

为了避免资源浪费(省钱),函数配置里

  • 关掉 SLS 日志
  • 单实例并发度拉满 100
  • 实例规格调整到最小

代码如下:

exports.handler = (req, resp, context) => {
    const target = `${req.headers?.["x-forwarded-proto"]}://${req.headers?.["host"].replace("oyohyee.com", "ohyee.cc")}${req.url}`;
    console.log({ url: req.url, target });
    
    const now = new Date();
    now.setMonth(now.getMonth() + 1);
    
    resp.setStatusCode(301);

    resp.setHeader("Location", target);
    resp.setHeader("Expires", now.toGMTString());
    resp.setHeader("Cache-Control", "public, max-age=2592000, immutable");

    resp.send(`<h1>${JSON.stringify(req)}</h1>`);
}

没几行,扔给 ChatGPT 讲下内容吧

当您使用这个代码时,它将把任何传入的HTTP请求重定向到另一个域名。这个域名是通过修改传入请求的Host标头来创建的。这个代码块是一个无服务器函数,可以在云环境中运行(例如AWS Lambda),以便在需要时自动缩放。

该函数接受三个参数:req(请求对象),resp(响应对象)和context(上下文对象)。请求对象包含有关传入HTTP请求的信息,例如URL和标头。响应对象用于向客户端发送HTTP响应,包括设置标头和正文。上下文对象包含有关运行时执行环境的信息。

然后,代码通过将主机标头中的域名从“oyohyee.com”替换为“ohyee.cc”来构造新的URL。然后使用新URL设置响应标头,以告诉客户端重定向到新的URL。Expires标头将重定向响应的到期日期设置为当前日期的一个月后,而Cache-Control标头则设置缓存策略来缓存重定向响应。最后,该函数发送一个HTML字符串作为响应正文,其中包含有关请求对象的JSON字符串。