You need to enable JavaScript to run this app.
导航

反向代理

最近更新时间2024.04.09 14:14:16

首次发布时间2023.02.15 19:04:51

升级HTTP请求

以下示例展示了如何通过边缘函数自动将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;
}