php - CDN 中的版本控制

标签 php caching mod-rewrite versioning cdn

有什么方法可以在 CDN 上为 jscss 实现类似的版本控制解决方案(不是 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 域似乎不起作用...

最佳答案

事实证明我的解决方案:

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

有效。我只是漏掉了代码中的一个空格。

关于php - CDN 中的版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9509069/

相关文章:

javascript - 是否可以从虚拟 URL 中提取 var,在元中使用它,但显示原始虚拟 URL?

node.js - 如何使用 Express.js 返回 304 Unmodified 状态?

javascript - CSS/JS 未加载。 CSS/JS 损坏

apache - .htaccess 文件重写超过应有的程度

php - 基于日期的 Laravel 日志文件

android - 如何防止应用程序被缓存在Android中

.htaccess - 尾部斜杠问题使用 mod_rewrite 用于 SEO 友好 URL

php - 使用 Laravel 构建推荐系统

php - 使用 AJAX 返回 JSON 对象失败

javascript - 如何将动态添加的内容存储到数据库