我有一个托管在 Apache 服务器上的 clickonce 存储库;出于显而易见的原因*,我不希望该存储库被代理服务器缓存。
我知道如果代理想要缓存某些内容,就没有办法阻止它,但我正在寻找一种方法,要么提示代理不要缓存我的 URL,要么为其提供“过时日期”。
有没有办法用 Apache 来实现这一点?如果没有,是否可以使用其他 Web 服务器(IIS?)来实现这一点?
如果有一些选项只适用于某些特定的代理供应商,我也会对这些选项感兴趣。
** 如果存储库被缓存,软件会根据“最新版本”(由代理保存)的过时副本检查其版本,而不是根据我的服务器上的“真实”最新版本进行检查。
答案1
使用 Apache 可以很容易地做到这一点,例如指定任何来自你的服务器的东西都不应该曾经被缓存,试试这个
<Location / >
ExpiresActive On
ExpiresDefault "now"
</Location>
你可能不想这样做,所以看看mod_expires 的文档并根据您的需要进行定制。
另外,请记住,在这种情况下,浏览器和代理的处理方式相同。通过发送响应中的过期标头来禁用缓存,您将为运行网站增加大量负载和成本,更不用说减慢访问者的访问速度了。
答案2
如果您谈论的是某种类型的缓存引擎(如 WAN 加速器),并且相关设备将独特的 UserAgent 附加到请求,那么您很幸运。在这种情况下,您可以制定如下规则,其中 是与SomeString
缓存引擎的用户代理匹配的字符串:
BrowserMatch SomeString no-cache-headers
Header set Cache-Control "no-cache, must-revalidate" env=no-cache-headers
Header set Pragma "no-cache" env=no-cache-headers
Header set Expires "Sat, 1 Jan 2000 00:00:00 GMT" env=no-cache-headers
在这里,我将“Expires”标题设置为过去的任意日期。
如果您谈论的是仅转发请求而不是自行发出请求的代理,那么您最多可以做的是阻止对这些对象的所有缓存,或者(更好一点)为这些对象设置较短的生命周期。您可以这样做:
ExpiresActive On
ExpiresDefault "access plus 1 hour"
你可以选择你想要的时间。或者你可以将“访问”作为过期时间的默认值,这意味着下一个请求应该得到一个新对象。但正如其他人指出的那样,你也会惩罚浏览器。
答案3
您可以在 HTML 页面上设置“Expires”元标记,也可以通过 Apache 或任何其他服务器设置一个/多个标头。以下是一些非常好的信息就此主题而言。
使用标题,基本上你可以设置最大年龄例如 1 秒,以及无缓存,无商店, 和必须重新验证标题,为了达到更好的效果,因为有一些行为不端/有缺陷的代理,这样你就可以确保覆盖所有的基础。
答案4
使用 Apache,您需要检查mod_expires。大多数代理都遵守 Expires HTTP 标头以及 max-age 等。