通过重定向通过访客?

时间:2019-01-23 03:35:50

标签: cloudflare-workers

当我的工作人员遇到来自原点的重定向时,它会跟随它并返回内容,而不是将重定向传递给访问者。有谁知道如何强迫工人用从原产地收到的相同重定向进行响应?

这是与代理一起使用的。

http://server.one/proxy-path/old-directory/请求被发送到http://server.two/old-directory/,该请求以301响应/ new-directory /。最终结果应该是将访问者发送到http://server.one/proxy-path/new-directory/,但发生的情况是工作程序遵循重定向并在/proxy-path/old-directory/路径下的/ new-directory /中提供了内容。

希望这是有道理的。感谢您提供任何见识!

2 个答案:

答案 0 :(得分:1)

跟随重定向是fetch()的默认行为。您可以像这样覆盖它:

fetch(url, {redirect: "manual"})

但是您的脚本可能存在更深层次的问题。通常,传入的event.request已经设置了redirect = "manual"属性,因此,如果将event.request直接传递给fetch(),那么您将获得想要的行为。如果看到自动遵循重定向,则表明您传递原始请求对象,此外,您还删除了一些原始请求的属性。

这通常在人们编写如下代码时发生:

// INCORRECT: Loses request properties and headers!
let newUrl = rewriteUrl(event.request.url);
event.respondWith(fetch(newUrl));

有时人们意识到这会丢失标头,因此他们尝试像添加标头一样将其添加回去:

// STILL INCORRECT: Loses request properties other than headers!
let newUrl = rewriteUrl(event.request.url);
event.respondWith(fetch(newUrl, {headers: event.request.headers}));

正确的 方法是将整个request对象作为第二个参数传递给fetch(),例如:

// CORRECT
let newUrl = rewriteUrl(event.request.url);
event.respondWith(fetch(newUrl, event.request));

这样,所有请求的属性(包括redirectmethodbody等)都将被复制。

请注意,如果要修改URL 标头,则需要执行两个步骤:

let newUrl = rewriteUrl(event.request.url);
let newHeaders = rewriteHeaders(event.request.headers);
// Create a new Request object with the new headers.
let newRequest = new Request(event.request, {headers: newHeaders});
// Fetch the new URL using the new Request object.
event.respondWith(fetch(newUrl, newRequest));

或者,您可以利用以下事实:您自己创建的Request对象(而不是在事件中收到的对象)是可变的:

let newUrl = rewriteUrl(event.request.url);
// Create a new Request object with modified URL.
let newRequest = new Request(newUrl, event.request);
// Modify the headers directly on this object.
newRequest.headers.set("X-Foo", "Bar");
// Forward it on.
event.respondWith(fetch(newRequest));

答案 1 :(得分:0)

我想我很快就问了这个问题。基于https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch,我看到可以将JavaFX添加到代理请求中,该请求将返回预期的重定向响应。