将请求从一个域转发到另一个域而不更改浏览器中的 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);
我正在尝试添加一个工作人员,它将 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);