CDN中的版本控制


Versioning in a CDN

有没有任何方法可以在CDN上为jscss文件实现类似的版本控制解决方案(本例中为而不是Cloudfront,Edgecast),将重写规则和PHP结合起来,就像本线程中描述的那样?我不知道有什么方法可以让PHP/mod重写组合在CDN上工作,经常更改我的版本,也不想手动进行版本控制。我使用一个没有cookieless的、完全独立的域来提供静态内容,所以我必须在函数中指定完整的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域似乎不起作用。。。

我的解决方案是:

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

工作。我只是在代码中漏掉了一个空格。

只是一个建议:看看Aptimize

版本控制问题已解决。许多CDN只执行定期的版本检查,这意味着页面可能会使用过期的资源。Aptimize通过独特的自动URL版本控制机制和在浏览器上积极缓存资源,主动检测版本更改并确保页面保持最新。