Curl HEAD请求返回last-modified头,Node.js https.request无此返回
为什么curl和Node.js的HEAD请求返回的响应头差异这么大?
这个问题的核心在于curl和Node.js的https模块发送的HEAD请求携带的默认请求头不一样,导致服务器对这两个请求做出了完全不同的处理:
1. 请求头差异触发了服务器的不同响应逻辑
curl发送HEAD请求时,会默认带上一些符合常规标准的请求头(比如User-Agent: curl/[对应版本号]),服务器识别到这是常见的命令行工具请求,直接返回了目标PGN文件的元数据响应头,自然包含last-modified这类文件相关字段。
而Node.js的https.request默认的请求头非常精简,尤其是User-Agent字段默认是Node.js/[你的Node版本号],服务器可能将其识别为非浏览器/非标准工具的请求,触发了特殊处理逻辑:
- 返回了
text/html类型的内容(大概率是验证页面或跳转页面) - 附带
set-cookie字段要求设置Cookie - 目标PGN文件的
last-modified字段自然不会出现在这类响应里
2. 验证猜测的解决方法
你可以在Node.js的请求里手动添加curl风格的请求头,模拟标准请求:
const https = require('https'); const options = { method: 'HEAD', headers: { 'User-Agent': 'curl/7.81.0', // 替换成你本地curl的版本号,或者任意常见浏览器UA也可以 'Accept': '*/*' } }; https.request('https://theweekinchess.com/assets/files/pgn/eurbli22.pgn', options, res => { console.log([res.url, res.headers]); }).end();
运行这段代码后,你应该就能拿到和curl一致的响应头,包括last-modified字段。
3. 本质原因
不少网站会通过User-Agent、Accept等请求头字段区分请求来源,对于识别为爬虫或非标准工具的请求,会返回验证页面、重定向结果而非目标资源;curl作为广泛使用的命令行工具,被服务器判定为“友好请求”,直接返回了文件的元数据。
内容的提问来源于stack exchange,提问作者Jeff Lowery
相关产品推荐
相关产品推荐

