返回 HTTP 200 (OK) 而不是 301 (Moved Permanently)

HTTP 200 (OK) returned instead of 301 (Moved Permanently)

此 URL return 代码 301 到 wgetcurl,但 node-fetch 报告 200:

# wget https://www.h24info.ma/feed
--2021-03-19 11:30:23--  https://www.h24info.ma/feed
Resolving www.h24info.ma (www.h24info.ma)... 104.21.39.120, 172.67.145.67, 2606:4700:3030::6815:2778, ...
Connecting to www.h24info.ma (www.h24info.ma)|104.21.39.120|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
# curl -I https://www.h24info.ma/feed
HTTP/2 301

但是获取 returns 200(并且永远挂起):

fetch('https://www.h24info.ma/feed', {
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36',
  'accept': 'text/html,application/xhtml+xml'
}).then(function (res) {

  console.error('node-fetch status: %s', res.status);
});

node-fetch status: 200

我错过了什么吗? Fetch 应该 return 301 以便可以中止请求并处理错误。

software version
node-fetch 2.6.1
node v14.15.3
npm 7.6.0
Operating System Linux 4.9.0-15-amd64 #1 SMP Debian 4.9.258-1 (2021-03-08) x86_64 GNU/Linux

默认情况下 fetch 透明地遵循重定向。也就是说,如果 URL 请求 returns 一个 301/302 重定向响应代码,fetch 将自动向重定向 URL 发出另一个请求,你得到的响应将是来自第二个请求的那个。

您可以通过获取选项对象中的 redirect 字段配置此行为:

fetch(URL, {
  redirect: 'manual' // do not follow redirects automatically
})

Check out the MDN docs for fetch 了解更多信息。

Fetch should return 301 so the request can be aborted and the error dealt with.

301 状态并不是真正的错误,所以在我看来 fetch 的默认行为是正确的。在大多数情况下,您想要的是 fetch 来请求指定的资源,而不管它实际在哪里。为此,如果服务器告诉 fetch 到别处寻找资源,它就会执行。