You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:25:28