服务器提供旧版本的文件

时间:2015-03-10 10:00:59

标签: php apache .htaccess caching server

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

我首先认为这是浏览器缓存的问题,但在我清除了所有内容之后它是相同的,并且它确定它不是浏览器缓存问题,因为即使:

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

有什么不对?怎么解决这个问题?

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

除外

1 个答案:

答案 0 :(得分:0)

好的,你可以试试这个:

首先,我们在.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,因此它不会使用缓存副本。

这也适用于图像,favicon和JavaScript。基本上任何不动态生成的东西。