PHP 缓存阻止我的网站显示实际文件,而是显示旧文件。我已经尝试了一切,但没有任何效果
PHP Caching stops my website from showing the actual files, and instead shows old files. I have tried everything and nothing works
我在本地主机上有一个 php 网站,它一直运行良好,但现在它只显示旧的 css 文件和旧的 js 文件。当我编辑文件并刷新页面时,没有任何变化。
尤其是css布局文件不想更新
我使用:
XAMPP 和
阿帕奇
我在 Whosebug 上阅读了很多关于这个问题的文章,但对我来说没有任何效果我已经尝试添加:
<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Content-Type: application/xml; charset=utf-8");
?>
但是出现错误:
This page contains the following errors: error on line 44 at column 8:
Opening and ending tag mismatch: link line 0 and head Below is a
rendering of the page up to the first error.
然后它将页面作为文档处理,只显示纯文本。
我尝试使用 .htaccess 文件,但那些 什么都没有。
我真的不知道怎么处理,我无法继续浏览网站,因为它不想更新,而且卡在旧页面上。
谁能帮我解决这个问题,因为我有点绝望了。
编辑:
所以我修复了错误,但它仍然没有更新
我将 PHP 更改为:
<?php
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>
因为它将我的页面显示为 XML,但这仍然没有更新布局。
如何让我的页面自动重新加载文件,所以没有 (CTRL + F5)。
只有当您的 html 页面的文档类型为 XHTML 时,才会出现此错误。您可以通过查看文档的第一行来检查这一点,它声明了一个 XTHML 文档类型:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
这意味着 所有 html 标签必须正确关闭,例如
<head>
<title>my webpage</title>
<link rel="stylesheet" type="text/css" href="mystyles.css"></link>
</head>
注意我在第三行添加的</link>
。解决这个问题的最简单方法是将文档类型更改为
<!DOCTYPE html>
这意味着您的文档不必是 well-formed。
另一种方法是关闭所有 html 标签。
我建议您试试这个,如果缓存问题仍然存在,请再来询问。
并且不缓存样式表文件
最简单的方法是在您更改样式时向样式表文档添加一个新参数(例如带有版本号的 ?ver):
<link rel="stylesheet" type="text/css" href="mystyles.css?ver01"></link>
应该可以,您不必更改样式表的文件名。
另一种更复杂的方法是安装 mod_expires 并在您的 apache2 配置中定义它:
ExpiresActive On
ExpiresDefault “access plus 10 days”
ExpiresByType text/css “access plus 1 second”
希望对您有所帮助!如果是这样,我将不胜感激接受这个答案。
我做了 3 件事来确保动态数据不会被缓存:
- 设置适当的响应 headers;
- 包括 HTML 元标记;
- 向可能更改的资源 URL 添加时间戳。
1。设置适当的响应 headers
基本上这些 header 设置了过去的过期时间,设置了许多指令来避免在您 PHP 输出和最终客户端修改或缓存您的源代码之间的服务。
Expires: Sat, 26 Jul 1997 05:00:00 GMT
Cache-Control: nocache, must-revalidate, no-store, max-age=0, private, max-stale=0, post-check=0, pre-check=0, no-transform
Pragma: no-cache
2。包括 HTML 元标记
一些代理和 web 客户端将解析 HTML(应该避免上面的 "no-transform" 指令)。因此,向 HTML 输出添加指令可进一步降低缓存的风险。
此 html 摘录中有两个 "expires" 规范 - 据我所知,一些 Web 客户端不会解析日期。
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Sat, 26 Jul 1997 05:00:00 GMT" />
3。向可能更改的资源 URL 添加时间戳。
静态资源(或同等资源),如图像、css 文件,还有 xml 文件、文本文件、字体等,应该缓存以提高性能,但您仍然希望避免更新时缓存。
通过向 URL 添加时间戳,URL 将取决于资源时间戳本身,这将阻止中间服务器提供缓存版本。
您可以将时间戳替换为静态 "tag",例如 "v1"、"v2" 等。但是我更喜欢计算时间戳,因为我不再需要考虑更新它.事实上,我几乎所有的资源都自动加了时间戳。
这是一个PHP例子:
// This is a simple example, it must be adapted to your environment.
// * $initialUrl is a URL like "//mystyle.css" without any get parameter.
// * $resourceUrl is the (relative) server path to that resource
// which could be "/var/www/mysit/mystyle.css"
// * filemtime gets the timestamp of the resource.
// * baseconvert gets a shorter representation of that timestamp.
// * The timestamp is appended to the URL by simple concatenation here.
// * $url can then be used to generate the HTML (echo ".... $url ...";).
// * This can (should) be wrapped in a function. Personally I have integrated
// it in the MVC Framework I use in an output filter and in a utility
// class method.
$url=$initialUrl.'?ts='.base_convert(filemtime($resourcePath),10, 36);
备注
有些指令可能是多余的,但最好是多余的,而不是让特定用户遇到问题。以上是实地体验的结果。例如,"no-transform" 是在远程调试用户环境后添加的,在该环境中,他的移动运营商的代理将 javascript 和 css 资源直接插入 HTML。这几乎是出乎意料的,并且在当时造成了不受欢迎的行为。
浏览器的功能也会随着时间的推移而变化,当您的一些用户仍在使用旧浏览器时,有些用户将无法理解某些指令。
所以我建议谨慎行事,尽可能多地添加反制措施。
我在本地主机上有一个 php 网站,它一直运行良好,但现在它只显示旧的 css 文件和旧的 js 文件。当我编辑文件并刷新页面时,没有任何变化。
尤其是css布局文件不想更新
我使用: XAMPP 和 阿帕奇
我在 Whosebug 上阅读了很多关于这个问题的文章,但对我来说没有任何效果我已经尝试添加:
<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Content-Type: application/xml; charset=utf-8");
?>
但是出现错误:
This page contains the following errors: error on line 44 at column 8: Opening and ending tag mismatch: link line 0 and head Below is a rendering of the page up to the first error.
然后它将页面作为文档处理,只显示纯文本。
我尝试使用 .htaccess 文件,但那些 什么都没有。
我真的不知道怎么处理,我无法继续浏览网站,因为它不想更新,而且卡在旧页面上。
谁能帮我解决这个问题,因为我有点绝望了。
编辑:
所以我修复了错误,但它仍然没有更新
我将 PHP 更改为:
<?php
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>
因为它将我的页面显示为 XML,但这仍然没有更新布局。
如何让我的页面自动重新加载文件,所以没有 (CTRL + F5)。
只有当您的 html 页面的文档类型为 XHTML 时,才会出现此错误。您可以通过查看文档的第一行来检查这一点,它声明了一个 XTHML 文档类型:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
这意味着 所有 html 标签必须正确关闭,例如
<head>
<title>my webpage</title>
<link rel="stylesheet" type="text/css" href="mystyles.css"></link>
</head>
注意我在第三行添加的</link>
。解决这个问题的最简单方法是将文档类型更改为
<!DOCTYPE html>
这意味着您的文档不必是 well-formed。
另一种方法是关闭所有 html 标签。
我建议您试试这个,如果缓存问题仍然存在,请再来询问。
并且不缓存样式表文件
最简单的方法是在您更改样式时向样式表文档添加一个新参数(例如带有版本号的 ?ver):
<link rel="stylesheet" type="text/css" href="mystyles.css?ver01"></link>
应该可以,您不必更改样式表的文件名。
另一种更复杂的方法是安装 mod_expires 并在您的 apache2 配置中定义它:
ExpiresActive On
ExpiresDefault “access plus 10 days”
ExpiresByType text/css “access plus 1 second”
希望对您有所帮助!如果是这样,我将不胜感激接受这个答案。
我做了 3 件事来确保动态数据不会被缓存:
- 设置适当的响应 headers;
- 包括 HTML 元标记;
- 向可能更改的资源 URL 添加时间戳。
1。设置适当的响应 headers
基本上这些 header 设置了过去的过期时间,设置了许多指令来避免在您 PHP 输出和最终客户端修改或缓存您的源代码之间的服务。
Expires: Sat, 26 Jul 1997 05:00:00 GMT
Cache-Control: nocache, must-revalidate, no-store, max-age=0, private, max-stale=0, post-check=0, pre-check=0, no-transform
Pragma: no-cache
2。包括 HTML 元标记
一些代理和 web 客户端将解析 HTML(应该避免上面的 "no-transform" 指令)。因此,向 HTML 输出添加指令可进一步降低缓存的风险。
此 html 摘录中有两个 "expires" 规范 - 据我所知,一些 Web 客户端不会解析日期。
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Sat, 26 Jul 1997 05:00:00 GMT" />
3。向可能更改的资源 URL 添加时间戳。
静态资源(或同等资源),如图像、css 文件,还有 xml 文件、文本文件、字体等,应该缓存以提高性能,但您仍然希望避免更新时缓存。
通过向 URL 添加时间戳,URL 将取决于资源时间戳本身,这将阻止中间服务器提供缓存版本。
您可以将时间戳替换为静态 "tag",例如 "v1"、"v2" 等。但是我更喜欢计算时间戳,因为我不再需要考虑更新它.事实上,我几乎所有的资源都自动加了时间戳。
这是一个PHP例子:
// This is a simple example, it must be adapted to your environment.
// * $initialUrl is a URL like "//mystyle.css" without any get parameter.
// * $resourceUrl is the (relative) server path to that resource
// which could be "/var/www/mysit/mystyle.css"
// * filemtime gets the timestamp of the resource.
// * baseconvert gets a shorter representation of that timestamp.
// * The timestamp is appended to the URL by simple concatenation here.
// * $url can then be used to generate the HTML (echo ".... $url ...";).
// * This can (should) be wrapped in a function. Personally I have integrated
// it in the MVC Framework I use in an output filter and in a utility
// class method.
$url=$initialUrl.'?ts='.base_convert(filemtime($resourcePath),10, 36);
备注
有些指令可能是多余的,但最好是多余的,而不是让特定用户遇到问题。以上是实地体验的结果。例如,"no-transform" 是在远程调试用户环境后添加的,在该环境中,他的移动运营商的代理将 javascript 和 css 资源直接插入 HTML。这几乎是出乎意料的,并且在当时造成了不受欢迎的行为。
浏览器的功能也会随着时间的推移而变化,当您的一些用户仍在使用旧浏览器时,有些用户将无法理解某些指令。
所以我建议谨慎行事,尽可能多地添加反制措施。