php缓存阻止我的网站显示实际文件,而是显示旧文件我什么都试过了,什么都没用

mgdq6dx1  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(183)

我在localhost上有一个php网站,它一直运行良好,但现在它只显示旧css文件和旧js文件。当我编辑文件和刷新页面时,没有任何变化。
尤其是css布局文件不想更新
我使用:xampp和apache
关于这个问题,我读了很多关于stackoverflow的文章,但是没有一篇对我的工作有效,我尝试添加了:

<?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");

?>

但这给出了一个错误:
此页包含以下错误:第8列第44行的错误:开始和结束标记不匹配:链接行0和下面的标题是第一个错误之前的页呈现。
然后它将页面作为文档处理,只显示纯文本。
我试过使用.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)。

rvpgvaaj

rvpgvaaj1#

我做了3件事来确保动态数据不会被缓存:
设置合适的响应头;
包括html元标记;
向可能更改的资源URL添加时间戳。

1. 设置适当的响应头

基本上,这些头文件在过去设置了过期,设置了许多指令,以避免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将依赖于资源时间戳本身,并且它将阻止中间服务器提供缓存版本。
你可以用一个静态的“标签”来替换时间戳,比如“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中。这是相当出乎意料的,它创造了一个不受欢迎的行为在当时。
浏览器功能也会随着时间的推移而变化,当一些用户仍在使用旧浏览器时,有些用户将无法理解某些指令。
因此,我建议你谨慎行事,尽可能多地增加对策。

7gcisfzg

7gcisfzg2#

只有当html页面的文档类型为xhtml时,才会发生此错误。您可以通过查看文档的第一行来检查这一点,它声明了一个xthml doctype:

<!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改为

<!DOCTYPE html>

这意味着你的文件不必格式良好。
另一种方法是关闭所有html标记。
我建议您试试这个,如果缓存问题仍然存在,请再次提出要求。

并且不缓存样式表文件

最简单的方法是只要在样式表文档中添加一个新参数(例如带有版本号的?ver),无论何时更改样式中的某些内容:

<link rel="stylesheet" type="text/css" href="mystyles.css?ver01"></link>

这样就可以了,您不必对样式表的文件名做任何更改。
另一种更复杂的方法是安装mod\u expires并在apache2配置中定义它:

ExpiresActive On
ExpiresDefault “access plus 10 days”
ExpiresByType text/css “access plus 1 second”

我希望这有帮助!如果是这样的话,我将很感激你能接受这个答案。

相关问题