Есть ли какой-нибудь способ создать аналогичное решение для управления версиями в 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, похоже, не работает ...