Переадресовать посетителю?

Когда мой работник встречает перенаправление из источника, он следует за ним и возвращает содержимое, а не передает перенаправление посетителю. Кто-нибудь знает, как заставить работника ответить тем же перенаправлением, которое он получает от источника?

Это в сочетании с прокси.

http://server.one/proxy-path/old-directory/ запрос отправлен http://server.two/old-directory/ который отвечает 301 в /new-directory/. Конечным результатом должно быть то, что посетитель отправляется на http://server.one/proxy-path/new-directory/ но происходит то, что работник следует за перенаправлением и подает содержимое из / new-directory / под /proxy-path/old-directory/ дорожка.

Надеюсь, это имело смысл. Спасибо за понимание!

2 ответа

Следующие перенаправления - это поведение по умолчанию 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));

Таким образом, все свойства запроса, в том числе redirect, method, bodyи т. д., скопируйте.

Обратите внимание, что если вы хотите изменить 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));

Я думаю, я задал вопрос в ближайшее время. На основании https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch я вижу, что могу добавить redirect: 'manual' на запрос прокси, который возвращает ожидаемый ответ о перенаправлении.

Другие вопросы по тегам