产品动态
安全公告
产品公告

example.com 接入到 EdgeOne。您期望根据用户的 IP 地址的哈希值始终将请求路由到对应的源站,确保用户无论身处何地,同一用户的请求始终被路由到同一源站,有助于优化缓存效率、简化会话管理、实现负载均衡和提供个性化服务,并确保数据处理的合法合规。X-Forwarded-For-Origin:originGroup1,将需要转发到新加坡的源站的 IP 通过边缘函数增加一个回源请求头为:X-Forwarded-For-Origin:originGroup2。// 根据客户端ip地址,返回到不同的源站组,也就是在IP地址不变的情况下,同一个客户端回到同一个源站const ORIGIN_GROUPS = ["originGroup1", "originGroup2"];// 定义虚拟节点数,若源站组(ORIGIN_GROUPS)较多时,建议调低虚拟节点数const VIRTUAL_NODES_PER_GROUP = 15;const ORIGIN_HEADER_NAME = 'X-Forwarded-For-Origin';let virtualNodesHashesCache = null;// 定义全局变量来跟踪函数调用次数addEventListener("fetch", (event) => {handleRequest(event.request);});async function handleRequest(request) {// 通过 EO-Client-IP 头部获取客户端 IPconst ip = request.headers.get("EO-Client-IP") || "";// 如果缓存中没有虚拟节点哈希值,则生成虚拟节点哈希值if (!virtualNodesHashesCache) {virtualNodesHashesCache = await generateVirtualNodesHashes();}const group = await findSourceGroupForIp(ip,virtualNodesHashesCache.hashes,virtualNodesHashesCache.mapping);console.log(`Group: ${group}`);request.headers.set(ORIGIN_HEADER_NAME, group)return;}// 生成虚拟节点的哈希值async function generateVirtualNodesHashes() {const virtualNodesHashes = {};for (let group in ORIGIN_GROUPS) {for (let i = 0; i < VIRTUAL_NODES_PER_GROUP; i++) {const virtualNodeIdentifier = `${group}-VN${i}`;const hash = await md5(virtualNodeIdentifier);if (!virtualNodesHashes[hash]) {virtualNodesHashes[hash] = group;}}}const hashes = Object.keys(virtualNodesHashes).sort();return { hashes, mapping: virtualNodesHashes }; // 返回排序后的哈希值数组和映射}// 映射客户端IP到虚拟节点,并找到对应的源站组async function findSourceGroupForIp(ip, hashes, mapping) {// 使用md5函数计算IP的哈希值const ipHash = await md5(ip);let closestHash = hashes.find((hash) => hash > ipHash) || hashes[0];// 根据找到的虚拟节点哈希值,从虚拟节点哈希表中获取对应的源站组名称const selectedGroupName = mapping[closestHash];const selectedGroupIPs = ORIGIN_GROUPS[selectedGroupName];// 打印日志,显示客户端IP、哈希值、最接近的虚拟节点哈希值、选定的源站组名称console.log(`IP: ${ip}, Hash: ${ipHash}, Closest Hash: ${closestHash}, Selected Group: ${selectedGroupName}`);// 返回选定的源站组名称return selectedGroupIPs;}function bufferToHex(arr) {return Array.prototype.map.call(arr, (x) => (x >= 16 ? x.toString(16) : "0" + x.toString(16))).join("");}async function md5(text) {const buffer = await crypto.subtle.digest("MD5", TextEncoder().encode(text));return bufferToHex(new Uint8Array(buffer));}

example.com 。
example.com。EO-Client-IP。X-Forwarded-For-Origin 等于originGroup1时,请求将被转发至中国大陆的源站组进行处理;当满足条件为 HTTP 请求头 X-Forwarded-For-Origin 等于originGroup2时,请求将被转发至新加坡的源站组进行处理。 
文档反馈