我在 Apache 服务器上托管了一个 clickonce 存储库;出于显而易见的原因*,我不希望此存储库被代理服务器缓存。
我知道没有办法阻止代理缓存某些内容,但我正在寻找一种方法来提示代理不要缓存我的 URL,或者为其提供“过时日期”。
有没有办法用 Apache 做到这一点?如果没有,是否可以使用另一个网络服务器(IIS?)
如果有一些选项只与某些特定的代理供应商合作,我也对这些感兴趣。
** 如果存储库被缓存,软件会根据“最新版本”(由代理持有)的过时副本检查其版本,而不是根据我的服务器上的“真实”最新版本检查自身。
使用 apache 很容易做到这一点,例如指定来自您的服务器的任何内容都不应该被缓存,试试这个
您可能不想完全这样做,因此请查看mod_expires 的文档并根据您的需要对其进行自定义。
另外,请记住,在这种情况下,浏览器和代理被视为相同。通过发送带有禁用缓存的响应的过期标头,您将增加运行站点的大量负载和成本,更不用说减慢访问者的访问速度。
如果您正在谈论某种缓存引擎,例如 WAN 加速器,并且相关设备将独特的 UserAgent 附加到请求中,那么您很幸运。在这种情况下,您可以有如下规则,其中
SomeString
将匹配缓存引擎的用户代理的字符串:在这里,我将“Expires”标题设置为过去的任意日期。
如果您正在谈论仅转发请求而不自己发出请求的代理,那么您最多可以做的是阻止这些对象的所有缓存,或者(更好一点)为这些对象设置较短的生命周期对象。你可以这样做:
在那里你可以选择你想要的时间。或者您可以将“访问”作为过期默认值,这意味着下一个请求应该获得一个新对象。但是在这里,正如其他人指出的那样,您也在惩罚浏览器。
您可以在 HTML 页面上设置“过期”元标记,也可以通过 Apache/任何服务器设置一个/多个标题。这里有一些关于这个主题的非常好的信息。
以下是在 IIS 上使用 ASP 的方法。
使用标头,基本上您可以将max-age设置为 1 秒,例如,以及no-cache、no-store和must-revalidate标头,因为有一些行为不端/错误的代理,这样你确保覆盖所有基础。
使用 Apache,您需要检查mod_expires。大多数代理都尊重 Expires HTTP 标头以及 max-age 等。