使用 Edge 函数
IBM Cloud® Internet Services 边缘功能允许您使用无服务器执行环境创建或修改现有应用程序,而无需配置或维护基础设施。 边缘函数可以被定义并上传到云端边缘,以便在请求到达源端之前进行处理。CIS 边缘函数可用于修改 HTTP 请求和响应、发出并行请求或从云端边缘生成响应。
Edge Functions 工作方式
边缘函数根据定义的域将操作与URI相关联。 这种关联被称为_触发器_。 您网站收到的请求在云端边缘被拦截,并与您账户或域名中的触发器进行匹配。 如果请求 URL 与触发器的 URI 匹配,则触发器关联的操作将运行。
边缘功能以现代网络浏览器中可用的 服务工作者API 为模型,并尽可能使用相同的API。
服务工作者应用程序接口(Service Worker API)允许您拦截任何对您的网站的请求。 在您的 JavaScript 处理请求后,您可以选择向您的网站或其他网站发出任意数量的子请求,最后向您的访客返回响应。
与标准 Service Worker 不同,Edge Functions 在 CIS Edge 服务器上运行,而不是用户的浏览器中。 这意味着您可以放心,您的代码运行在受信任的环境中,不会被恶意客户端绕过。 这也意味着用户无需使用支持服务工作者的现代浏览器——您甚至可以拦截来自非浏览器API客户端的请求。
Edge 功能在内部使用与 Chrome 浏览器相同的 V8 JavaScript 引擎,用于在我们的基础设施上运行工作进程。 V8 将 JavaScript 代码动态编译为超快机器代码,从而提高性能。 这样,您的代码就可以在微秒级运行,我们的边缘服务器每秒可以运行数千个脚本。
虽然 Edge 函数使用 V8,但它不使用 Node.js。工作程序中可供您使用的 JavaScript API 由我们直接实施。 直接使用 V8 将允许代码通过保证客户和基础架构安全所需的安全性控制更高效地运行。
使用 Edge 函数请求属性
在这里,我们讨论了 CIS Edge 函数的 Cloudflare 运行时 API。 Edge 函数运行时提供了以下 Cloudflare API,供在云边缘运行的脚本使用。
构造函数语法
new Request(input [, init])
构造函数参数
-
input
:可以是包含 URL 的 USVString,也可以是现有的Request
对象。 请注意,url
属性是不可更改的,因此当修改请求并更改 URL 时,您必须在此参数中传递新的 URL。 -
init
(可选): 一个选项对象,其中包含要应用于请求的定制设置。 有效的选项为:method
: 请求方法,例如GET
或POST
headers
:Headers
对象-
body
: 要添加到请求的任何文本。 使用GET
或HEAD
方法发送的请求不能包含正文。 -
redirect
: 访存请求时遵循的方式。 从事件处理程序入局fetchEvent
生成的请求的缺省值为manual
。 新构造的请求的缺省值 (换言之,new Request (url)
) 是follow
。 有效选项:follow
: 如果将重定向响应返回到访存,那么将根据响应中的Location
头来触发另一个访存,直到返回非重定向代码为止。 例如,await fetch(..)
无法返回301
重定向。manual
: 从访存返回重定向响应。
-
属性
入局 Request
对象 (event.request
) 的所有属性都是只读的。 要修改请求,必须创建 Request
对象并将要修改的选项传递给其构造函数。
body
: 公开ReadableStream
内容的简单 getter 方法。bodyUsed
: 一个布尔值,用于声明是否在响应中使用了主体。cf
: 包含我们的合作伙伴在 Cloudflare 提供的数据的对象。headers
: 包含请求的关联Headers
对象。method
: 与请求关联的请求方法,例如GET
或POST
。redirect
: 要使用的重定向方式 (follow
或manual
)。url
:包含请求的 URL。
cf
对象
除了标准 Request
对象上的属性外,您还可以使用 request.cf
对象来控制如何应用功能以及 Cloudflare 提供的其他定制信息。 例如
if (request.cf.asn == 64512) {
return new Response('Block the ASN 64512 response')
}
如果使用 https://cloudflareworkers.com 来编写和测试脚本,那么 request.cf
内容在预览方式下不可用。 您必须处于生产状态才能运行该内容。
这些属性包含来自入局请求的特殊信息,以帮助处理应用程序的逻辑。 所有计划都可以访问:
asn
: 入局请求的 ASN (例如,395747
)。colo
: 请求命中的数据中心的三字母机场代码 (例如,"DFW"
)。weight:
浏览器请求的 HTTP/2 优先级划分权重。exclusive:
浏览器请求的 HTTP/2 互斥标志 (1 表示基于 Chromium 的浏览器,0 表示其他浏览器)。- 请求组的
group:
HTTP/2 流标识 (仅对于 Firefox为非零)。 group-weight
: 请求组的 HTTP/2 权重 (仅对于 Firefox为非零)。tlsCipher
: 用于连接到 CIS 的密码 (例如,"AEAD-AES128-GCM-SHA256"
)。country
: 入局请求的双字母国家或地区代码。CF-IPCountry
头中提供了相同的值 (例如,"US"
)。tlsClientAuth
: 仅当为 mTLS启用时才设置。 该对象具有以下属性:certIssuerDNLegacy
,certIssuerDN
,certIssuerDNRFC2253
,certSubjectDNLegacy
,certVerified
,certNotAfter
,certSubjectDN
,certFingerprintSHA1
,certNotBefore
,certSerial
,certPresented
和certSubjectDNRFC2253
tlsVersion
: 与 CIS 的连接的 TLS 版本 (例如,TLSv1.3
)。
标准 和 Enterprise 套餐有权访问:
requestPriority
: 请求对象中浏览器请求的优先级划分信息 (例如,“weight=192;exclusive=0;group=3;group-weight=127”
)。city
: 入局请求的城市 (例如,"Austin"
)。continent
: 传入请求的大部 (例如,"NA"
)。httpProtocol
:HTTP 协议(例如,"HTTP/2"
)。latitude
: 传入请求的纬度 (例如,"30.27130"
)。longitude
: 入局请求的经度 (例如,"-97.74260"
)。postalCode
: 入局请求的 PostalCode (例如,"78701"
)。region
: 如果已知,那么这是与入局请求的 IP 地址相关联的第一级区域的 ISO 3166-2 名称。 如果未知,那么它是空字符串 (例如,"Texas"
)。regionCode
: 如果已知,那么这是与入局请求的 IP 地址关联的第一级区域的 ISO 3166-2 代码。 如果未知,那么它是空字符串 (例如,"TX"
)。timezone
: 入局请求的时区 (例如,"America/Chicago"
)。
所有套餐都可以在出站请求上设置这些功能。
-
cacheEverything
: 此选项强制 CIS 对此请求的响应进行高速缓存,而不考虑在响应上看到的头。 这相当于将页面规则“高速缓存级别”设置为“高速缓存所有内容”(例如,true
)。 -
scrapeShield
: 切换 ScrapeShield (例如,false
)。 -
polish
: 设置 Cloudflare 波兰语方式。 可能的值为 "lossy","lossless" 或 "off" (例如,lossless
)。 -
minify
: 用于对各种文件类型启用/禁用 Cloudflare Autominify 的 Web 站点优化。 该值是包含javascript
,css
和html
的布尔字段的对象 (例如,{ javascript: true, css: true, html: false }
)。 -
mirage
: 用于启用/禁用 Cloudflare 幻影的映像优化。 指定此选项时,值应该始终为false
(例如,false
)。 -
cacheTtl
: 此选项强制 CIS 对此请求的响应进行高速缓存,而不考虑在响应上看到的头。 这相当于设置两个页面规则:“边缘高速缓存 TTL”和“高速缓存级别”(设置为 "高速缓存所有内容"; 例如,300
)。 -
resolveOverride
: 将请求重定向到备用源服务器。 您可以使用此方法在多个源 (例如,us-east.example.com
) 之间实现负载均衡。出于安全考虑,“
resolveOverride
中设置的主机名必须代理到与传入请求相同的”CIS区域。 否则,该设置将被忽略。 允许使用 CNAME 主机,因此要解析到不同域或仅 DNS 域下的主机,首先要在自己区域的 DNS 映射中声明一条指向外部主机名的 CNAME 记录,在CIS 上设置代理,然后设置resolveOverride以指向该 CNAME 记录。
仅企业
cacheKey
: 请求的高速缓存键用于确定两个请求是否“相同”以进行高速缓存。 如果请求具有与先前某个请求相同的高速缓存密钥,那么我们可以为这两个请求提供相同的高速缓存响应 (例如,'some-key'
)。cacheTtlByStatus
: 此选项是cacheTtl
功能部件的版本,它根据响应的状态码选择 TTL。 如果对此请求的响应具有匹配的状态码,那么 CIS 将在指示的时间进行高速缓存,并覆盖由源发送的高速缓存指令 (例如,{ "200-299": 86400, 404: 1, "500-599": 0 }
)。 CIS 仍遵循标准高速缓存级别,因此缺省情况下,这将覆盖静态文件的高速缓存行为。 如果您想缓存非静态资源,必须使用页面规则将缓存级别设置为“全部缓存”。
边缘函数脚本在 CIS 安全性功能部件之后运行,但在其他所有功能部件之前运行。 因此,Edge功能脚本不会影响安全功能的运行(因为它们已经完成),但会影响其他功能,例如图像大小优化,或者边缘缓存响应的方式。
更新 cf
对象类似于修改请求。 您可以通过将定制对象传递到 fetch
,将 cf
对象添加到 Request
。
// Disable ScrapeShield for this request.
fetch(event.request, { cf: { scrapeShield: false } })
将以静默方式忽略 cf
对象中的无效或未正确命名的设置。 请注意测试您是否正在获取想要的行为。
Edge 函数用例
这些示例仅用于演示目的,而不用于生产。