如何在整个站点中禁用 http 缓存?
Posted
技术标签:
【中文标题】如何在整个站点中禁用 http 缓存?【英文标题】:How to disable http cache in the entire site? 【发布时间】:2013-02-01 20:43:48 【问题描述】:我需要能够将网站置于“维护模式”。所以我在 app.php 中使用了一个像这样的廉价黑客(原来的 app.php 被移到了 app.php.bak):
<?php
$key = 123;
if(isset($_GET['skip_maintenance_key']) && $_GET['skip_maintenance_key'] == $key)
setcookie('skip_maintenance_key', $key);
if(isset($_COOKIE['skip_maintenance_key']) && $_COOKIE['skip_maintenance_key'] == $key)
include 'app.php.bak';
// placeholder
else
//header('Cache-Control: public, maxage=30');
header('Status: 503 Service Unavailable');
include 'html/error/503.html';
问题是,只要我点击一个使用 http 缓存的页面,该页面就会被 Cloudflare 或我自己的代理等中介缓存,并开始提供给所有人。
所以我想做的是在维护期间以某种方式全局禁用http缓存,也许在// placeholder
中添加一行代码?
有什么想法吗?
【问题讨论】:
【参考方案1】:我读到 Fabien 说(在被拒绝的拉取请求中)这应该由 Web 服务器处理。所以我改变了我的维护脚本来修改服务器配置而不是框架。
问题是服务器无法删除缓存标头。但后来我发现nginxHttpHeadersMoreModule 工作得很好,所以问题解决了。
【讨论】:
【参考方案2】:如果您可以访问 httpd.conf,您可以添加:
Header set Cache-Control no-cache
Header set Expires 0
如果没有,请查看tutorial
【讨论】:
如果你有一个 PHP 文件包含在任何其他文件中,也许这也可以在 PHP 中工作 我没有使用 Apache,我使用的是 nginx。 我对 nginx 不太了解...但是如果您有一个包含在任何其他文件中的 php 文件,您可以在 php 中修改标头! 不,我尝试用 ob_start() 和 ob_get_clean() 封闭(以避免发送输出,并能够修改标题),然后是 header_remove('Cache-Control')。但我不确定发生了什么,我在想 Symfony2 在完成后调用 exit() 或其他东西。所以在包含之后我似乎什么都做不了。 你可以试试这个:header('Cache-Control: no-store, no-cache, must-revalidate');这应该会关闭缓存!以上是关于如何在整个站点中禁用 http 缓存?的主要内容,如果未能解决你的问题,请参考以下文章
如何将整个站点从 HTTP 重定向到 HTTPS,Drupal 站点中的 2 个页面除外?