Фон
В настоящее время я работаю над проектом Rails 3, который намереваюсь использовать с Amazon CloudFront с пользовательским источником, указывающим на мой настоящий веб-сервер. Это означает, что мой веб-сервер скажет браузеру извлечь статические активы из CloudFront, если CloudFront кэширует ресурс, он вернет его, если не получит его, используя тот же путь с моего веб-сервера, а затем кеширует его на будущее запросы.
Задача
Amazon CloudFront удаляет и игнорирует параметры строки запроса при определении того, следует ли использовать собственный кэш для повторной загрузки ресурса из его источника. Это, очевидно, создает проблему с тем, как Rails генерирует URL с RAILS_ASSET_ID
, что должно сделать: /assets/path/to/asset.ext?RAILS_ASSET_ID
. При использовании URL-адресов активов по умолчанию CloudFront будет удерживать устаревшие активы в течение 24 часов.
Решение
То, что я надеюсь сделать, так или иначе переопределить способ, которым Rails 3 генерирует теги ресурсов, чтобы я мог генерировать URL-адреса, такие как /assets/RAILS_ASSET_ID/path/to/asset.ext
. У меня уже есть решение о том, как заставить веб-сервер реагировать на эти URL, мне просто нужно выяснить, как заставить Rails генерировать URL.
Примечания
- My
RAILS_ASSET_ID
будет подстрокой моего последнего хита git commit. Установка этого параметра будет обрабатываться Capistrano в процессе развертывания. Я согласен с использованием всех кэшей ресурсов в каждом развертывании, мне не нужны идентификаторы для конкретных активов
- Я уже пытался переопределить
ActionView::Helpers::AssetTagHelper.rewrite_asset_path
, но, похоже, это не сработало, и из того, что я прочитал, это частный метод, на который нельзя полагаться.
- Заранее спасибо!