最近更新时间:2024.04.09 14:14:16
首次发布时间:2023.02.15 19:04:51
以下示例展示了如何通过边缘函数自动将HTTP请求升级成HTTPS请求回源站,这个例子没有使用302跟随,而是静默的自动升级为HTTPS回源站。
// 本示例展示在边缘自动将反向代理流量变为HTTPS,防止劫持等 addEventListener("fetch", (event) => { event.respondWith(upgradeToSSL(event)); }); async function upgradeToSSL(event) { const incomingRequest = event.request; const url = new URL(incomingRequest.url); // 1 查看请求是否为http协议 if (url.protocol == 'http:') { url.protocol = 'https'; // 2. 如果是,则更改协议,其他部分透传 return fetch(url.toString(), { method: incomingRequest.method, headers: incomingRequest.headers, body: incomingRequest.body }); } else { // 3. 如果是https协议,则直接fetch return fetch(incomingRequest); } }
addEventListener("fetch", (event) => { event.respondWith(handle(event)); }); // 这个例子在请求发送到边缘的时候,记录时间戳,然后直接透传请求;当回复抵达边缘, // 增加一个新的回复头,然后继续透传回复。整个过程没有任何http 请求/回复的缓冲, // 几乎不会增加任何延时。边缘函数运行时会自动优化http的body透传部分。 async function handle(event) { const request = event.request; // 更改下请求的头,增加一个 x-via-sparrow: timestamp 头 request.headers.append("x-via-sparrow-start", `${Date.now()}`); // 发送请求到源站,await fetch并不会造成延时的增加,fetch的只会在回复头解析 // 结束后就立即resolve fetch的 promise,而不会buffer任何恢复的body部分。在 // 边缘函数运行时中,透传 fetch的response,不会造成回复进入边缘函数的JavaScript // 部分,不造成任何性能/内存损耗,而是直接在网络层传递。只需要更改回复头, // 那么await fetch即可,body部分不用await。 const response = await fetch(request); response.headers.append("x-via-sparrow-done", `${Date.now()}`); return response; }