为何301永久重定向会缓存而302不会?如何禁用301缓存?
问题解答
一、301与302重定向缓存差异的原因
- 301永久重定向:HTTP协议规范将其定义为"永久移动",浏览器、CDN等缓存系统会长期保存该重定向规则。首次请求后,后续相同路径的请求会直接由缓存处理,不再向服务器发起请求,因此你的统计逻辑和日志代码不会被执行。
- 302临时重定向:协议定义其为"临时移动",缓存系统不会长期存储该规则,每次请求都需要先向服务器确认重定向状态,所以每次请求都会触发你服务器端的统计和日志逻辑。
二、服务器端强制禁用301重定向缓存的方法
在ASP.NET Core中,直接使用Redirect(permanent: true)会自动添加默认的缓存头,导致301被缓存。你需要手动设置301状态码、跳转地址,并覆盖缓存相关的响应头,确保每次请求都能到达服务器。
修改后的代码示例:
app.Use(async (context, next) => { string strUrlPath = context.Request.Path.ToString().ToLowerInvariant(); switch (strUrlPath) { case string _ when strUrlPath.StartsWith("/deprecated_page"): { // 执行访问次数统计逻辑,写入数据库 // 记录访问该页面的用户等日志 Log.LogContext().Warning(...); // 设置301永久重定向状态码 context.Response.StatusCode = StatusCodes.Status301MovedPermanently; // 指定跳转目标页面 context.Response.Headers.Location = "/404"; // 添加禁用缓存的响应头,覆盖默认缓存规则 context.Response.Headers.CacheControl = "no-cache, no-store, must-revalidate"; context.Response.Headers.Pragma = "no-cache"; context.Response.Headers.Expires = "0"; return; } default: await next(); break; } });
各缓存头的作用
Cache-Control: no-cache, no-store, must-revalidate:禁止缓存任何内容,每次请求必须重新向服务器验证,同时要求缓存过期后必须重新获取最新资源。Pragma: no-cache:兼容HTTP/1.0版本的客户端,确保旧浏览器也不会缓存该重定向。Expires: 0:将缓存过期时间设置为立即过期,强制客户端每次都发起新请求。
内容的提问来源于stack exchange,提问作者Codingwiz
相关产品推荐
相关产品推荐

