Переадресовать посетителю? - PullRequest
0 голосов
/ 23 января 2019

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

Это связано с прокси.

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 ]

0 голосов
/ 23 января 2019

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

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

...