Переадресовать посетителю?
Когда мой работник встречает перенаправление из источника, он следует за ним и возвращает содержимое, а не передает перенаправление посетителю. Кто-нибудь знает, как заставить работника ответить тем же перенаправлением, которое он получает от источника?
Это в сочетании с прокси.
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'
на запрос прокси, который возвращает ожидаемый ответ о перенаправлении.