在CDN中进行版本控制

时间:2012-03-01 00:44:07

标签: php caching mod-rewrite versioning cdn

是否有任何方法可以在jscss文件的CDN( Cloudfront,在本例中为Edgecast)上实现类似的版本控制解决方案,结合重写规则和PHP,在this thread中描述?我不知道如何让PHP / mod-rewrite组合在CDN上运行,经常更改我的版本,并且不想手动进行版本控制。我使用无cookie,完全独立的域来提供静态内容,所以我必须在函数中指定完整的URL。

为方便起见,我将在此处列出其他主题的代码。

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

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-s # Make the file doesn't actually exist
RewriteRule ^(.*)\.[\d]+\.(css|js)$ $1.$2 [L] # Strip out the version number

现在,我们编写以下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="<?=auto_version('/css/base.css')?>" type="text/css" />

这将呈现为此类内容,确保始终提供最新版本,而无需手动更新版本:

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

为了让这个在外部CDN(在一个完全不同的域上)工作,我试图替换

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

通过类似的东西......

<link rel="stylesheet" href="<?='http://cdn.externaldomain.com' . auto_version('/css/base.css')?>" type="text/css" />

但是围绕内部URL包装函数并添加CDN域似乎不起作用......

2 个答案:

答案 0 :(得分:3)

事实证明我的解决方案:

<link rel="stylesheet" href="<?= 'http://cdn.externaldomain.com' . auto_version('/css/base.css') ?>" type="text/css" />

的工作原理。我错过了代码中的空格。

答案 1 :(得分:1)

只是一个建议: 看看Aptimize

  

版本问题已解决。许多CDN仅执行定期版本检查 - 这意味着可以使用过时的资源来提供页面。 Aptimize主动检测版本更改并确保页面保持最新,具有独特的自动URL版本控制机制以及在浏览器上积极缓存资源。