Edge Functions 如何運作
IBM Cloud® Internet Services 邊緣功能可讓您透過使用無伺服器執行環境來建立或修改現有的應用程式,而無需設定或維護基礎架構。 邊緣函式可定義並上載至雲邊緣,以便在請求到達原點之前對其進行處理。CIS 邊緣函式可用於修改 HTTP 請求與回應、提出平行請求或從雲邊緣產生回應。
邊緣函式根據定義的網域將動作與 URI 相關聯。 這種關聯稱_為觸發器_。 傳送至您網站的要求會在雲端邊緣被攔截,並與您帳戶或網域中的觸發器進行比對。 如果請求 URL 與觸發器的 URI 吻合,就會執行與觸發器相關的動作。
Edge 功能是以現代網頁瀏覽器中的 Service Worker API 為藍本,並盡可能使用相同的 API。
Service Worker API 允許您攔截任何向您網站提出的請求。 在您的 JavaScript 處理請求之後,您可以選擇向您的網站或其他網站提出任何數量的子請求,最後將回應回傳給您的訪客。
與標準「服務工作者節點」不同,Edge Functions 是在 CIS 邊緣伺服器上執行,而不是在使用者的瀏覽器中執行。 這表示您可以相信您的程式碼是在可信賴的環境中執行,不會被惡意的用戶端繞過。 這也代表使用者不需要使用支援服務工作者的現代瀏覽器 - 您甚至可以攔截非瀏覽器的 API 用戶端的要求。
在內部,Edge 功能使用與 Chrome 瀏覽器相同的 V8 JavaScript 引擎,在我們的基礎架構上執行 Worker。 V8 會動態將 JavaScript 程式碼編譯成超快速的機器碼,以加強效能。 這使得您的程式碼可以在微秒內執行,而我們的邊緣伺服器則可以每秒執行數千個腳本。
雖然 Edge 函數會使用 V8,但它不會使用 Node.js。工作者節點內可供您使用的 JavaScript API 由我們直接實作。 直接使用 V8 可讓程式碼的執行更有效率,並透過所需要的安全控制來保護客戶及基礎架構的安全。
使用 Edge Functions 要求內容
在這裡,我們討論 CIS Edge 函數的 Cloudflare 執行時期 API。 Edge Functions 執行時期提供下列 Cloudflare API,供在雲端邊緣執行的 Script 使用。
建構子語法
new Request(input [, init])
建構子參數
-
input
:可以是包含 URL 的 USVString,或現有的Request
物件。 請注意url
屬性是不可變的,所以當修改一個請求並變更 URL 時,必須在此參數中傳入新的 URL。 -
init
(選用): 包含要套用至要求之自訂設定的 options 物件。 有效的選項如下:method
: 要求方法,例如GET
或POST
headers
:Headers
物件-
body
: 要新增至要求的任何文字。 使用GET
或HEAD
方法的請求不能有 body。 -
redirect
: 提取要求時所遵循的模式。 從事件處理程式送入的fetchEvent
產生的要求預設值為manual
。 新建構要求的預設值 (換言之,即new Request (url)
) 是follow
。 有效選項:follow
: 如果將重新導向回應傳回提取,則會根據回應中的Location
標頭發動另一個提取,直到傳回非重新導向碼為止。 例如,await fetch(..)
永不會傳回301
重新導向。manual
: 重新導向從提取傳回的回應。
-
內容
送入 Request
物件 (event.request
) 的所有內容都是唯讀的。 如果要修改要求,您必須建立 Request
物件,並將要修改的選項傳遞給其建構子。
body
: 簡式 getter,用於公開內容的ReadableStream
。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 來撰寫及測試 Script,則 request.cf
內容在預覽模式下無法使用。 您必須在正式作業中,才能執行該內容。
這些內容包含來自送入要求的特殊資訊,以協助您處理應用程式的邏輯。 所有計劃都有權存取:
asn
: 送入要求的 ASN (例如395747
)。colo
: 要求所命中資料中心的三個字母機場代碼 (例如"DFW"
)。weight:
瀏覽器要求的 HTTP/2 優先順序的加權。exclusive:
瀏覽器所要求的 HTTP/2 專用旗標 (1 代表 Chromium 型瀏覽器,0 代表其他瀏覽器)。- 要求群組的
group:
HTTP/2 串流 ID (僅限 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
)。
標準 和 企業 方案有權存取:
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 的網站最佳化。 該值是包含javascript
、css
和html
的布林欄位的物件 (例如,{ javascript: true, css: true, html: false }
)。 -
mirage
: 啟用/停用 Cloudflare 幻象的映像檔最佳化。 當您指定此選項時,值應該一律為false
(例如,false
)。 -
cacheTtl
: 此選項會強制 CIS 快取此要求的回應,而不管在回應上看到哪些標頭。 這相當於設定兩個頁面規則: "Edge Cache TTL" 和 "Cache Level" (to "Cache Everything"; for example,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 仍遵循標準快取層次,因此依預設,這會置換靜態檔案的快取行為。 如果要快取非靜態資產,必須使用頁面規則設定快取等級為快取一切。
Edge Functions Script 在 CIS 安全特性之後執行,但在其他一切之前執行。 因此,Edge 功能腳本無法影響安全功能的運作 (因為它們已經完成),但它可以影響其他功能,例如影像大小最佳化,或回應如何在邊緣緩存。
更新 cf
物件類似於修改要求。 您可以將自訂物件傳遞至 fetch
,以將 cf
物件新增至 Request
。
// Disable ScrapeShield for this request.
fetch(event.request, { cf: { scrapeShield: false } })
cf
物件中無效或名稱不正確的設定會無聲自動忽略。 請小心測試您是否已取得您想要的行為。
Edge 函數使用案例
這些範例僅供示範之用,不適用於正式作業。