生产环境中follow-redirects表现异常,返回ETag与404问题排查
解决follow-redirects生产环境随机404(ETag缓存导致)的方案
针对你遇到的生产环境随机出现重定向404且返回ETag的问题,核心思路是让目标服务每次都将你的请求识别为全新请求,跳过缓存校验。以下是几个直接可行的方案:
1. 强制禁用缓存请求头
直接在请求头中明确告知目标服务不要使用任何缓存,同时移除可能触发ETag校验的条件请求头:
const { https } = require('follow-redirects'); const requestOptions = { headers: { // 强制服务端不使用缓存 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', // 清空可能携带的ETag校验头,避免服务端匹配旧缓存 'If-None-Match': '', 'If-Modified-Since': '' } }; https.get('你的目标重定向URL', requestOptions, (res) => { // 处理响应逻辑 }).on('error', (err) => { console.error('请求失败:', err); });
2. 给请求URL添加唯一标识参数
通过在目标URL后追加随机值(比如时间戳、随机字符串),让每个请求的URL都独一无二,服务端会将其视为新请求,不会触发缓存匹配:
const { https } = require('follow-redirects'); const baseUrl = 'https://example.com/your-redirect-path'; // 追加时间戳确保URL唯一 const uniqueRequestUrl = `${baseUrl}?cache_bust=${Date.now()}`; https.get(uniqueRequestUrl, (res) => { // 处理响应逻辑 });
3. 重定向过程中重置请求头
follow-redirects默认会在重定向时继承部分请求头,可能导致后续跳转请求携带了之前的缓存相关头。可以监听redirect事件,在每次跳转前重置关键头:
const { https } = require('follow-redirects'); const req = https.get('你的目标重定向URL', (res) => { // 处理响应逻辑 }); // 监听重定向事件,重置缓存相关头 req.on('redirect', (response, nextReqOptions) => { // 删除可能触发ETag校验的头 delete nextReqOptions.headers['If-None-Match']; delete nextReqOptions.headers['If-Modified-Since']; // 强制添加禁用缓存的头 nextReqOptions.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'; });
补充说明
本地环境正常但生产出问题的原因通常是:生产环境存在CDN、反向代理等中间层缓存了ETag,或者目标服务在高并发场景下的缓存策略更严格;而本地请求直接对接目标服务,没有中间缓存,请求频率低也不会触发服务端的缓存校验逻辑。
内容的提问来源于stack exchange,提问作者Edd Chang
相关产品推荐
相关产品推荐

