将请求从一个域转发到另一个域而不更改浏览器中的 URL

Forward request from one domain to another without changing the URL in browser

我正在尝试添加一个工作人员,它将 redirect/forward 来自 https://test1.com to https://test2.com

的请求
const redirectHttpCode = 301
const targetUrl = "https://test2.com"
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
  if (targetUrl) {
    return Response.redirect(targetUrl, redirectHttpCode)
  }
  return fetch(request)
}

路由配置为*test1.com/*到上面的worker

如果我尝试访问 https://test1.com it redirects the request to https://test2.com 并按预期更改浏览器中的 URL,状态代码为 301。

是否可以 forward/redirect 来自 https://test1.com to https://test2.com 的请求而不更改浏览器中的 URL 或者用户知道发生了重定向?

如示例Respond with another site所示,您需要调用respondWith最终网站的答案。鉴于 respondWith 可以处理 Response 或最终将展开为响应的承诺,最简单的情况是返回一个获取调用:

async function handleEvent(event) {
  event.respondWith(fetch('https://www.test2.com'))
}

在这种情况下,您将连接两个流,而无需等待 test2

当用例涉及修改实际响应时(如示例中:Alter Headers),您将需要等待获取的结果,并对它的克隆执行任何修改,因为前者是不可变的。

async function handleRequest(request) {
  const response = await fetch('https://www.test2.com'),
        modifiedResponse = new Response(response.body, response);

  modifiedResponse.headers.set('Access-Control-Allow-Origin', '*')
  return modifiedResponse;
}

async function handleEvent(event) {
  event.respondWith(handleRequest(event.request))
}

勘误表 2022-02-21

最初的答案说您可以克隆响应以获得可变 headers 的响应。这是错误的。正在做

    modifiedResponse = response.clone();

为您提供一个克隆,其 headers 与原始版本一样不变。正确的方法是使用Response构造函数

    modifiedResponse = new Response(response.body, response);