31

我有一个网站,我继承了它的维护,这是一个大毛茸茸的烂摊子。
我正在做的一件事是提高性能。除其他外,我正在向Expires图像添加标题。

现在,有一些图像是通过 PHP 文件提供的,我注意到它们确实有Expires标题,但它们也每次都被加载。

查看响应标头,我看到了这一点:

Expires Wed, 15 Jun 2011 18:11:55 GMT
Cache-Control   no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma  no-cache

这显然解释了这个问题。

现在,我查看了整个代码库,但它在任何地方都没有说“pragma”。.htaccess 似乎也没有任何相关内容。

有什么想法可以设置那些“pragma”(和“cache-control”)标头,我该如何避免呢?

4

7 回答 7

31

罪魁祸首可能是 php.ini,其中 session.cache_limiter=nocache。将值更改为空白或公共以避免反缓存标头。

于 2011-04-18T16:51:44.887 回答
12

我有一个类似的问题Pragma: nocache

session_cache_limiter(false);之前session_start();似乎压制了它。

于 2012-01-04T02:06:20.743 回答
10

创建一个不包含任何 PHP 库但与通过 PHP 文件提供图像的文件位于同一文件夹中的简单文件。

file: test.php

通过浏览器请求此文件并检查标题。如果您看到不需要的响应标头,您就知道它们是通过 apache 配置的,而不是通过 PHP 文件生成的,您可以将搜索集中在目录树中的 .htaccess 文件和 http.confg和其他包含的 apache 配置文件。你会想要搜索

<Directory....

<VirtualHost

可能适用于您的网站的部分。

如果您在对该简单 PHP 文件的请求中没有看到标头,则您知道 PHP 正在某处设置标头。在图像服务文件的末尾(或在它回显图像并退出之后),但以下 PHP 片段)

var_dump(get_included_files());

通过图片服务 URL 请求图片。上面的代码片段将打印出请求中使用的所有 PHP 文件。(您可能需要查看源代码或使用 curl 来查看原始输出,因为浏览器会报告无效图像)

将文件的子集用于工作文件,在它们中搜索对

header();

功能。该header函数是(我认为)原始 PHP 代码可以设置响应标头的唯一方法。您还需要搜索

call_user_func
eval
$$

如果页面上有任何动态代码使用 PHP 的元编程功能来调用该header函数。

祝你好运!

于 2010-06-15T18:50:14.200 回答
9

尝试取消设置.htaccess. 下面的示例将为与扩展名匹配的所有文件取消设置它们ico, jpeg, png, gif, js, css:

<FilesMatch "\.(ico|jpeg|png|gif|js|css)$">
    Header unset Cache-Control
    Header unset Pragma
</FilesMatch>

您可以在本文中找到一些提示。

于 2010-06-15T18:53:50.760 回答
4

我在运行时这样做了:

header("Pragma:");

这迫使脚本取消设置 Pragma 标头。

于 2011-12-20T18:25:32.703 回答
1

如果它不在 .htaccess 中,它可能在主 Apache 配置文件中 - 或其中一个包含,具体取决于设置。

于 2010-06-15T18:24:49.420 回答
0

对于有类似问题的人来说值得注意的是,许多框架会自动添加头文件,尤其是缓存头文件。在框架库或应用程序中重载它们相当容易。

于 2012-08-13T22:44:39.963 回答