【问题标题】:Does it make sense to set Http Cache Headers on a 404 response?在 404 响应上设置 Http Cache Headers 是否有意义?
【发布时间】:2010-10-11 19:18:24
【问题描述】:

我有一个存储图像的数据库,可以通过主键 ID 访问(呕吐,我知道,但它不在我的控制范围内)。

我有一个非常标准的 Asp .net Mvc 控制器,它读取数据库,如果在数据库中找到一行,它会将图像字节作为 FileResult 返回。如果没有找到一行,我有一个自定义操作结果,将响应状态设置为 404。我不抛出异常,而是让 IIS 处理 404 状态并返回一个静态文件。

public class ContentMediaNotFoundResult : ActionResult
{
    public ContentMediaNotFoundResult() { }

    public override void ExecuteResult(ControllerContext context)
    {
        //-- Here the only thing we are doing is setting the Response code to 404 and then we are   going to let IIS service the request
        //-- based on the settings in system.webServer/httpErrors (which may come from the root .config, so be careful)
        context.HttpContext.Response.StatusCode = 404;
    }
}

最近,我们在 Firefox v3.6.1 上进行测试,并注意到浏览器对每个图像发出多个请求(准确地说是 3 个),因此我们的控制器工厂被命中 3 次,并从我们的数据库访问数据库 3 次动作方法。此行为仅在 Firefox 中发生(IE、chrome 正常)。

我的问题是,将 Http Cache Headers 添加到我的 ContentMediaNotFoundResult 中的 404 响应是否有意义,这样我的操作方法就不会不断地访问数据库。

【问题讨论】:

    标签: asp.net-mvc http iis-7


    【解决方案1】:

    当然,您可以为 404 设置缓存标头。正如@Darin 提到的,您的缓存老化可能会影响替换 404 图像的任何问题,但这与缓存任何可能更改的对象的问题相同。

    似乎只有 5xx 错误可能不应该被缓存,但 4xx 很好。

    【讨论】:

    • 我同意 500 和 501 可能不应该被缓存,但我认为 503 可能是放置短缓存标头的好方法。当您重新上线时,它可能有助于阻止人们敲打您的服务器。
    • Firefox 既不缓存 404 也不缓存 400 响应。它不会尊重 http 缓存标头。这显然是设计使然。您可以使用可缓存的 410 并将使用 Cache-control 标头。另见:developer.mozilla.org/en-US/docs/Web/HTTP/Status/410
    • @Nux 正在阅读您的评论,我担心您对 FF 的看法是正确的。仍然找不到任何确认 FF 的 404/400 设计选择不缓存这些的来源。您能否提供更多相关信息?
    • RFC 7231 规定 404 响应是可缓存的:httpwg.org/specs/rfc7231.html#status.404 如果 Firefox 从不缓存 404,则它们偏离了规范。
    【解决方案2】:

    我的观点是视情况而定。如果您有一个快速变化的 Web API,其中可能随时添加资源,那么您希望客户端始终查询来源。

    如果您有很多内容变化不大,缓存 404 可能会有很大帮助。

    看看这个真实的例子:

    http://highscalability.com/blog/2010/3/26/strategy-caching-404s-saved-the-onion-66-on-server-time.html

    【讨论】:

    • 我也尝试使用浏览器缓存来处理 404 错误,但我发现了一些奇怪的场景。当我输入 URL“testsite.com/testblabla.png”时,我们会收到带有电子标签的 404 响应,如果我刷新相同的浏览器选项卡,它不会使用浏览器缓存,就像我在它正在从浏览器缓存中使用它的新选项卡。太奇怪了,在 Firefox 上也根本没有使用浏览器缓存来处理 404 状态。伙计们,如果您也遇到同样的问题,请告诉我。
    【解决方案3】:

    在 404 页面上设置缓存标头没有任何意义,因为如果稍后将具有此 id 的图像添加到数据库中,用户仍然会得到 404。也许你应该试着理解为什么 FireFox 会向这个 url 发送 3 个请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-12
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多