响应标头不适用于带有“重定向:手动”的提取请求

Pou*_*sen 5 fetch-api

我在做

        console.log("navigating");
        var rsp = await fetch(params.url, {
            credentials: "include", redirect: "manual", mode: "cors"
        });
        console.log(rsp);
        rsp.headers.forEach(console.log);

        console.log(rsp.headers.get('Location'));
        console.log(rsp.headers.get('location'));
Run Code Online (Sandbox Code Playgroud)

以及chrome开发工具的响应标头:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:4400
Access-Control-Expose-Headers: Location
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 0
Date: Fri, 05 Oct 2018 12:48:21 GMT
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Location: http://localhost/test
Run Code Online (Sandbox Code Playgroud)

给

Response 
body: (...)
bodyUsed: falseheaders: 
Headers {}
ok: false
redirected: false
status: 0
statusText: ""
type: "opaqueredirect"
url: "..."

index.ts:161 null
index.ts:162 null
Run Code Online (Sandbox Code Playgroud)

是否无法在重定向响应中获取响应头?

sid*_*ker 6

是否无法在重定向响应中获取响应标头?

不,这不可能。Fetch 规范中的要求阻止了它。

问题显示的内容是预期的redirect: "manual"。具体来说,暴露给前端 JS 的 headers 对象在响应redirect: "manual"请求时应该是空的。

更多细节:当一个请求设置时redirect: "manual",响应类型是opaqueredirect。有关其影响的信息位于https://developer.mozilla.org/en-US/docs/Web/API/Response/type:

opaqueredirect: 获取请求是用redirect: "manual". 响应的状态为 0,标头为空,正文为空,尾标为空。


那篇 MDN 文章中的细节直接基于 Fetch 规范的以下部分:

https://fetch.spec.whatwg.org/#concept-request-redirect-mode

请求具有相关联的重定向模式,这是"follow","error",或"manual"。
...
"manual":当请求遇到重定向时检索不透明重定向过滤的响应,以便可以手动跟踪重定向。

https://fetch.spec.whatwg.org/#concept-filtered-response-opaque-redirect

opaque-redirect 过滤响应是一个过滤响应,其类型为"opaqueredirect",状态为0,状态消息是空字节序列,头列表为空,正文为空
……
一个不透明过滤响应和一个不透明重定向过滤响应几乎与网络无法区分错误

  • _"manual:当请求遇到重定向时检索不透明重定向过滤的响应,以便可以手动跟踪重定向"_ 但 `response.url` 不是重定向 URL,而是原始 URL。如果我无法看到重定向 URL 是什么,我该如何手动处理重定向? (3认同)
  • 为什么它被阻止了? (2认同)