【问题标题】:Should I set the Cache-Control header when serving up files? Or not?提供文件时是否应该设置 Cache-Control 标头?或不?
【发布时间】:2010-03-05 19:49:32
【问题描述】:

我正在通过 asp.net 中的 HTTPModule 提供一些文件。我想知道设置或不设置 Cache-Control 标头是否有任何好处(如无缓存)?

编辑:我对此感到好奇的原因是我们遇到了一个问题,即通过 IE 中的 SSL 会话提供办公文档会导致错误(缓存控制设置为 no -缓存)。也就是说,如果你将Cache-Control设置为no-cache,IE中就不能通过SSL下载office文档了。

基本上我不想包含 Cache-Control 标头,但想知道它是否会导致问题?

编辑 2: 好吧,Cache-Control 标头已经出来了。我尝试了以下建议,但遇到了一些问题。每当我添加过期标头或更改 Cache-Control 时,当我尝试打开 Office 2007 文档时,它会尝试将其作为 zip 打开。 (我知道它们实际上是隐藏的 zip 文件)但是当我不使用过期标头或缓存控制时,IE 会像 Office 文档一样打开它们。不幸的是,我没有时间尝试弄清楚这一切 - 因为代码冻结是从现在开始的十分钟 :)

感谢大家的帮助!

【问题讨论】:

    标签: c# asp.net http-headers download


    【解决方案1】:

    根据雅虎!和YSlow 你应该。看到这个article

    更新:根据您的评论,您似乎正在尝试阻止缓存。我会使用:

    Cache-Control: max-age=0 
    

    对我来说,它比使用 Expires 标头更简单、更明确。

    更新 2:听起来您需要为 office 文档指定 Content-Type 标头。尝试使用以下:

    Content-Type: application/octet-stream
    

    【讨论】:

    • 我认为 no-cache 是他们认为我应该设置的? no-cache 的问题在于,如果您在 SSL 会话上运行,则无法在 IE 中下载 Office 文档。我想删除 no-cache 缓存控制标头,但我担心得到过时的文档。
    • 你可能会觉得这个 SO 问题很有趣:stackoverflow.com/questions/1046966/…
    • 非常感谢您的建议!不幸的是,正如我在上面编辑过的问题中提到的那样 - 现在 IE 不再将 Word 2007 文档识别为 Office 文件格式,而是尝试以 zip 格式打开文件。当我完全删除 Cache-Control 标头时,IE 8 再次知道这些文件是 Office 文档。奇怪!
    • 将办公文档的 Content-Type 标头设置为 application/octet-stream。
    • 谢谢 Taylor,我认为 Content-Type 已经是 octet-stream,但我会仔细检查!
    【解决方案2】:

    您可以尝试将Expires 标头设置为过去的日期/时间,而不是使用Cache-Control

    【讨论】:

    • 大多数现代浏览器和代理会遵守 expires 标头吗?我已经很久没有真正知道 HTTP 1.1 的哪些部分得到完全支持,哪些部分仍然存在问题。
    • 关于 HTTP 代理,我知道 Squid 可以处理 Cache-Control 和 Expires。
    • 查看我上面的编辑 - 我尝试了 expires 标头,但 IE 8 将办公文档作为 zip 文件打开。如果没有 expires 标头,IE 知道在 Office 中打开 office 文档。奇怪我知道...但我没有时间弄清楚:(不过感谢您的建议!
    • 您是否指定了内容类型标头?这很重要。
    【解决方案3】:

    这绝对是一个奇怪的问题......但这里有一个快速的解决方案,可以防止您的用户获得过时的内容:

    如果您在 URL 的末尾附加一个额外的查询字符串参数以使对 Office 文件的每个请求都是唯一的,则无需在标头中设置缓存控制信息即可。

    您当前的网址可能如下所示:

    http://mysite.com/filegetter?name=document.doc

    加上额外的“唯一”参数:

    http://mysite.com/filegetter?name=document.doc&ts=

    这将防止浏览器向您的用户提供陈旧的办公文件,并且该方法可以在客户端或服务器代码中实现。处理将文件发回给您的用户的模块只是忽略了 URL 中使其对您的用户浏览器唯一的部分。

    【讨论】:

    • 这是真的,应该可以工作,但它有点 hackish。我相信 Cache-Control: max-age=0 应该做同样的事情。
    • 毫无疑问,这是“解决方法”......但它会起作用。我认为这是 YUI 用来确保 AJAX 请求不被浏览器缓存的方法。
    • 我其实很喜欢这种保持文件新鲜的方法。它适用于 css 文件和 js 文件。 ASP.Net 在向 WebResource.axd 处理程序发出请求时使用它。不幸的是,这对我来说不是一个选择,因为没有这个查询字符串参数的链接太多了,我只有几分钟的时间来修复:(
    【解决方案4】:

    我不得不对successfully render PDF files inside IE6 with no caching使用“no-store”。

    【讨论】:

    • 感谢您链接到的帖子中的好主意。我满怀希望!我试过了,办公文件打开得很好。不幸的是,IE 8 仍在缓存通过同一个 HTTPModule 提供的图像。也就是说,我不确定它是否真的在做任何事情来防止过时的文件。 (docx、pdf 等在缓存方面从来都不是真正的问题,但是通过同一个模块提供的图像是 :( 我可能不得不将图像作为单独的案例处理。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2019-01-20
    • 2020-12-03
    相关资源
    最近更新 更多