域名配置

为使函数和Pages能通过自定义公网路径访问,您需要为其配置一个域名作为触发入口。边缘安全加速 ESA提供域名绑定路由两种方式,用于将 HTTP/S 请求引导至您的函数和Pages

限制条件

无论是使用域名绑定还是路由,都需要账号下存在一个处于可用状态的站点。

可用状态是指站点已购买套餐且完成NSCNAME的方式接入。

选择合适的配置方式

特性

域名绑定

路由

核心用途

将指定域名(例如 api.example.com)的所有请求,全部交由同一个函数和Pages处理。

仅将特定域名下匹配预设路径(例如 example.com/api/*)的请求,路由到函数和Pages处理,其余路径的请求不受影响。

影响范围

域名下的全量流量

匹配规则的部分流量

配置方式

简单,一步到位

灵活,需要配置匹配规则

适用场景

  • 专用的 API 网关函数

  • 完整的 SSR(服务器端渲染)应用

  • 对特定 API 路径进行鉴权或日志记录

  • 为特定页面路径实现 A/B 测试

  • 拦截特定请求并返回自定义内容

使用域名绑定

域名绑定适用于将一个域名的全部流量都定向到指定的函数和Pages进行处理。

域名绑定功能允许您将函数和Pages链接至自己的站点域名,在完成域名绑定后,您可以直接使用该域名对函数和Pages进行访问。函数和Pages绑定的域名需要归属于某个可用站点,在控制台配置后,ESA将自动在站点下添加一条绑定域名的DNS记录。

image
  1. 登录ESA控制台,在左侧导航栏选择边缘计算 > 函数和Pages单击需要进行绑定的函数和Pages

  2. 选择域名页签,单击域名绑定栏的添加域名image

  3. 输入您要为函数和Pages绑定的域名信息,例如er.example.com。域名添加后,将在域名对应的站点下创建新的DNS记录。

    说明

    域名绑定功能新增的域名遵循对应站点下的各项配置,所以如果您的站点未配置SSL/TLS证书,则该绑定域名无法使用HTTPS进行访问。关于站点开启SSL/TLS方式请参见SSL/TLS

    image

  4. DNS生效后(约1分钟),在浏览器访问刚绑定的自定义域名(如er.example.com)即可查看效果。image

使用路由配置

适用于仅将特定 URL 路径的请求转发至函数和Pages处理,实现更精细化的流量控制。当请求与配置的URL匹配时,将由函数和Pages处理该请求,否则将继续执行加速回源的ESA流程。如下图所示,当您为example.com站点配置了example.com/a*的路由规则后,所有与路由规则匹配的路径访问例如/a/a1/a2都会由函数和Pages处理,而其他与路由规则不匹配的路径访问例如/b/c/d会继续遵循加速回源或缓存的流程。

image
  1. 登录ESA控制台,在左侧导航栏选择边缘计算 > 函数和Pages单击需要进行绑定的函数和Pages

  2. 选择域名页签,单击路由栏的添加路由image

  3. 填写路由名称,在选择站点列表中选择目标站点,例如:example.com

  4. 选择路由模式

    1. 简单模式:适用于仅基于 URL(主机名+路径)进行匹配的场景。例如,配置URL前缀为pages.example.com的所有请求都路由至函数和Pagesimage

    2. 自定义模式:适用于需要组合多个条件(如请求头、Cookie、请求方法等)进行复杂逻辑匹配的场景。您可以添加多个匹配条件,并设置条件间的逻辑关系(满足所有/满足任意)。例如,您可以配置一条规则:当 主机名 等于 www.example.com 并且 User-Agent 请求头包含 Mobile 时,才将请求转发至函数和Pagesimage

  5. 单击确定

重要
  • 如果路由使用简单模式时,输入的是*.example.comwww.example.com这种带有前缀的域名,需要在ESADNS记录存在一条对应的记录或手动添加一条记录,否则访问将失败。

  • 函数路由如果存在多条配置,从上至下一旦有一条匹配成功,则跳出不再执行下面的匹配。

匹配规则

  • 路由配置必须同时包含域名主机名和路径URI信息,因此任何只包含路径URI的路由规则例如/path将无法配置。

  • 路由配置通过添加前后通配符*的方式来匹配更多请求,通配符*支持匹配零个或多个任意字符。例如example.com/*将匹配访问example.com的所有请求。

  • 路由配置区分大小写。例如example.com/aexample.com/A将是两条不同的路由规则。

  • 路由配置不支持配置中间通配符*和参数。例如example.com/*/pathexample.com/path?param=1的形式都是不允许的。

  • 当访问请求和多个路由配置都可以匹配时,将优先匹配更早配置的规则项。

旁路模式

开启函数路由的旁路模式后,如果您的请求命中路由策略,请求将以子请求的方式旁路访问函数和Pages服务。旁路模式的整体流程为:

imageimage
  1. 客户端发起请求访问ESA边缘节点。

  2. 请求命中路由策略,被转发至函数和Pages处理,您可以在函数和Pages根据请求内容进行日志打点、鉴权等操作。需要注意,开启旁路模式时,请求体将不会被转发至函数和Pages

  3. 如果函数和Pages返回的响应中状态码是200,则请求将继续后续处理流程;如果返回响应中状态码非200,ESA将中止对该请求的处理并返回403给客户端。

  4. 该请求将根据后续策略匹配请求,继续执行ESA的缓存匹配或加速回源逻辑。

  5. 缓存命中后的响应或源站的响应返回ESA节点,此时该响应不会再由函数和Pages处理。

  6. 响应被转发至客户端。

常见场景

  • 日志打点场景:如果您希望对部分请求产生打点日志,便可以将请求通过旁路模式转发至函数和Pages,并在函数中自定义日志打点逻辑。

  • 大文件下载鉴权场景:边缘函数在将响应转发至客户端时,会消耗CPU时间,如果响应内容过大,往往会造成CPU时间片超限,并产生额外的费用。您可以使用旁路模式通过函数和Pages完成鉴权,避免上述问题的发生。

常见问题

如何通过代码进行旁路模式改造?

URL鉴权方式A为例:

  • 将入口函数由async fetch()改为async bypass()

  • 函数返回值需要通过new ResponseBypass()构造。其中包含两个参数

    • 第一个truefalse,表示鉴权成功或失败。

    • 如果第一个参数为false,则可传入第二个参数status表示返回给客户端的状态码。

原鉴权方式A示例代码

import { createHash } from "node:crypto";

async function handleRequest(request) {
  const url = new URL(request.url);
  const path = url.pathname;
  const delta = 3600;

  const authKeyTypeA = url.searchParams.get('auth_key');

  const privateKey = 'your_secret_key'
  const currentTimestamp = Math.floor(Date.now() / 1000);

  if (!authKeyTypeA) {
    //鉴权失败场景,边缘默认返回403给客户端。
    return new Response('Unauthorized', { 
      status: 401,
    });
  }

  const [timestamp, rand, uid, signature] = authKeyTypeA.split('-');

  if (currentTimestamp > parseInt(timestamp)+ delta) {
    //鉴权失败场景,边缘默认返回403给客户端。
    return new Response('Link expired', {
      status: 403,
    });
  }

  const signString = [path, timestamp, rand, uid, privateKey].join('-');

  const md5 = createHash('md5').update(signString).digest('hex');

  if (md5 !== signature) {
  
    return new Response('Unauthorized', {
      status: 401
    });
  }

  // 如果资源在其他域名,则请求后返回
  // const yourUrl = `https://your-dcdn-domain.com${path}${url.search}`
  // const cdnResponse = await fetch(yourUrl, request)
  // return new Response(cdnResponse.body, cdnResponse)

  // 大多情况下回源即可
  return fetch(request.url)
}

export default {
  async fetch(request) {
    return handleRequest(request)
  }
}

鉴权方式A使用旁路模式示例代码

import { createHash } from "node:crypto";

async function handleRequest(request) {
  const url = new URL(request.url);
  const path = url.pathname;
  const delta = 3600;

  const authKeyTypeA = url.searchParams.get("auth_key");

  const privateKey = "your_secret_key";
  const currentTimestamp = Math.floor(Date.now() / 1000);

  if (!authKeyTypeA) {
    //鉴权失败场景,传参false,边缘默认返回403给客户端。
    return new ResponseBypass(false, {
      status: 401,
    });
  }

  const [timestamp, rand, uid, signature] = authKeyTypeA.split("-");

  if (currentTimestamp > parseInt(timestamp) + delta) {
    //鉴权失败场景,传参false,边缘默认返回403给客户端。
    return new ResponseBypass(false, {
      status: 403,
    });
  }

  const signString = [path, timestamp, rand, uid, privateKey].join("-");

  const md5 = createHash("md5").update(signString).digest("hex");

  if (md5 !== signature) {
    //鉴权失败场景,传参false,边缘默认返回403给客户端。
    return new ResponseBypass(false, {
      status: 401,
    });
  }

  //鉴权成功场景,传参true,则请求继续走回源逻辑,且响应不再经过函数处理。
  const resSuccess = new ResponseBypass(true);
  return resSuccess;
}

export default {
  async bypass(request) {
    return handleRequest(request);
  },
};

如何修改域名绑定?

如果您目前绑定的域名及路由不能满足您当前的业务需求,您可以已绑定的域名及路由进行编辑或删除操作。

  1. 登录ESA控制台,在左侧导航栏选择边缘计算 > 函数和Pages单击需要进行修改的函数和Pages

  2. 选择域名页签。

  3. 您可在域名页面,对已绑定的域名进行删除操作,已绑定的路由进行编辑删除操作。