Есть ли способ достижения аналогичного решения для версии на CDN (а не Cloudfront, Edgecast в этом случае) для js
и css
файлов как довольно опрятный, сочетающий правило Rewrite и PHP, описанные в этом потоке ? Я не знаю, как сделать комбинацию PHP / mod-rewrite работать на 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, ie /css/base.css, replaces it with a string containing the * file's mtime, ie /css/base.1221534296.css. * * @param $file The file to be loaded. Must be an absolute path (ie * 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-адресом и агрессивным кэшированием ресурсов в браузере.