【问题标题】:Server providing old version of a file提供旧版本文件的服务器
【发布时间】:2015-03-10 10:00:58
【问题描述】:

我在.htaccess 密码下有一个网站。 而且服务器上的文件/static/js/main.js不是访问时服务的那个。

我一开始以为是浏览器缓存的问题,但是我清除了一切之后还是一样,确定不是浏览器缓存的问题,因为:

wget www.website.com/static/js/main.js 下载了错误的旧文件。

有什么问题吗?如何解决?

PS : 当我昨天注意到提供的文件是错误的旧文件时,我尝试删除 htaccess 以刷新,但它是一样的,我又把它放了。现在,网站上的每个文件都需要密码,除了旧的/static/js/main.js...

【问题讨论】:

  • 您确定您在编辑文件时处于正确的路径吗?看起来您在另一个文件夹中编辑了文件
  • 是的,我确定,我通过 FTP 检查了数百次。
  • 您的服务器上有缓存系统吗?或者在你和你的服务器之间?喜欢 cloudflare?
  • 我不这么认为。可以肯定的是,我们没有 cloudflare。我们正在使用 OVH 共享主机。

标签: php apache .htaccess caching server


【解决方案1】:

好的,你可以试试这个:

首先,我们在 .htaccess 中使用以下重写规则:

RewriteEngine on
RewriteRule ^(.*)\.[\d]{10}\.(css|js)$ $1.$2 [L]

现在,我们编写以下 PHP 函数:

/**
 *  Given a file, i.e. /css/base.css, replaces it with a string containing the
 *  file's mtime, i.e. /css/base.1221534296.css.
 *  
 *  @param $file  The file to be loaded.  Must be an absolute path (i.e.
 *                starting with slash).
 */
function auto_version($file)
{
  if(strpos($file, '/') !== 0 || !file_exists($_SERVER['DOCUMENT_ROOT'] . $file))
    return $file;

  $mtime = filemtime($_SERVER['DOCUMENT_ROOT'] . $file);
  return preg_replace('{\\.([^./]+)$}', ".$mtime.\$1", $file);
}

现在,无论您在哪里包含您的 CSS,都将其更改为:

<link rel="stylesheet" href="/css/base.css" type="text/css" />

到这里:

<link rel="stylesheet" href="<?php echo auto_version('/css/base.css'); ?>" type="text/css" />

这样,您无需再次修改链接标签,用户将始终看到最新的 CSS。浏览器将能够缓存 CSS 文件,但是当您对 CSS 进行任何更改时,浏览器会将其视为新 URL,因此它不会使用缓存的副本。

这也适用于图像、网站图标和 JavaScript。基本上任何不是动态生成的。

【讨论】:

  • 是的,这将解决问题。该文件的缓存为 1 年,现在将 htaccess 更新为 0 秒,但是,我猜服务该文件的 rooter 仍然认为它必须为 main.js 服务 1 年。当请求“main.js”时,我们如何重置它们所服务的 rooter / dns 的缓存文件?
  • 请阅读这篇文章websiteoptimization.com/speed/tweak/cache它可能对你有帮助,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 2019-10-31
  • 2020-08-01
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多