Управление версиями в CDN - PullRequest
4 голосов
/ 01 марта 2012

Есть ли какой-нибудь способ создать аналогичное решение для управления версиями в CDN (, а не Cloudfront, в данном случае Edgecast) для файлов js и css как довольно аккуратный, объединяющий правило перезаписиа PHP, описанный в этой теме ?Я не знаю, как заставить эту комбинацию 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 ]

3 голосов
/ 01 марта 2012

Получается мое решение:

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

работает. Я только что пропустил пробел в коде.

1 голос
/ 01 марта 2012

Просто предложение: Посмотрите на Aptimize

Проблемы с версиями решены. Многие CDN выполняют только периодическую проверку версий - это означает, что страницы могут обслуживаться устаревшими ресурсами. Aptimize активно обнаруживает изменения версий и обеспечивает актуальность страниц благодаря уникальному механизму автоматического создания версий URL-адресов и агрессивному кешированию ресурсов в браузере.

...