我正在使用PHP脚本以及一些.htaccess
规则来缓存破坏,以便在静态网站上自动控制文件的版本。
脚本的源代码在这里:http://www.particletree.com/notebook/automatically-version-your-css-and-javascript-files/
我更改了变量和函数的名称,但我认为这不是问题所在。
Script in header.php:
<?php
function VERSIONING($url){
$path = pathinfo($url);
$ver = '.'.filemtime($_SERVER['DOCUMENT_ROOT'].$url).'.';
echo $path['dirname'].'/'.str_replace('.', $ver, $path['basename']);
}
?>
在header.php中使用脚本,css等函数:
<?php VERSIONING('/resources/css/stylesheet.css'); ?>
<?php VERSIONING('/resources/js/script.js'); ?>
<?php VERSIONING('/resources/img/logo.png'); ?>
。缓存破坏的Htaccess规则:
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+).(d+).(js|css|jpe?g|png|gif|ico)$ $1.$3 [L]
</IfModule>
现在问题来了。它工作得很好,但是每隔10-24小时左右,我在我的error_log
文件中收到错误,我在VERSIONING
上使用的每个文件。
每个错误看起来像这样:
[16-Mar-2013 09:06:24] PHP Warning: filemtime(): stat failed for /usr/local/apache/htdocs/resources/js/script.js in /home5/username/public_html/resources/header.php on line 42
第42行包含以下内容:
$ver = '.'.filemtime($_SERVER['DOCUMENT_ROOT'].$url).'.';
我不知道是什么问题。我唯一的猜测是有时对DOCUMENT_ROOT的解释不同,并且在版本控制期间无法正确定位文件。
任何想法?
看起来您的问题是您正在传递一个相对URL到您的版本控制功能,这需要磁盘上的文件路径,并且/或者您在共享平台上并且$_SERVER['DOCUMENT_ROOT']是服务器的根而不是您的站点
作为一个快速修复,我将定义一个常量,为你的根,看起来可能是这样的
define('SITE_ROOT', '/home5/username/public_html');
then try
function VERSIONING($url){
$path = SITE_ROOT.$url;
$ver = '.'.filemtime($path).'.';
echo str_replace('.', $ver, $url);
}