Как настроить mod_rewrite для обслуживания мини-файлов, если они доступны?
-
04-07-2019 - |
Вопрос
Вот проблема:у нас есть множество Javascript и CSS-файлов, которые мы предпочли бы минимизировать.Минификация проста:настраиваем YUI Compressor, запускаем задачу Ant, и он выдает минифицированные файлы, которые мы сохраняем рядом с оригиналами.
Таким образом, где-то внутри нашего DocumentRoot мы получаем следующую структуру каталогов:
/ /js /min foo-min.js bar-min.js foo.js bar.js quux.js /css ...
Теперь нам нужно, чтобы Apache обслуживал файлы из мин подкаталог, и переход на обслуживание несжатых файлов, если их минифицированные версии недоступны.Последняя проблема - это та, которую я не могу решить.
Например:предположим, у нас есть запрос на example.com/js/foo.js — в этом случае Apache должен отправить содержимое /js/min/foo-min.js.Нет минифицированного quux.js, поэтому запросите /js/quux.js возвращает /js/quux.js сам, а не 404.Наконец, если нет /js/fred.js, в итоге должно получиться 404.
На самом деле я настраиваю сценарии сборки таким образом, чтобы неминифицированные файлы не развертывались на рабочем сервере, но эта конфигурация все равно может быть полезна на сервере интеграции и на машинах разработки.
Решение
Вот конфигурация, которая наконец заработала:
/js/.htaccess:
RewriteEngine On
RewriteBase /js
RewriteCond %{REQUEST_URI} ^/js/((.+)\.js)$
RewriteCond %{DOCUMENT_ROOT}/js/min/%2-min.js -f
RewriteRule ^(.+)$ min/%2-min.js [L]
То же самое для CSS каталог.
Другие советы
Вы можете использовать RewriteCond для обнаружения минимизированного файла:
RewriteCond %{REQUESTURI} ^/js/(.*\.js)
RewriteCond js/min/%1 -f
RewriteRule %1 min/%1 [L]
Можно ли изменить ваши сценарии сборки? Если это так, вы можете настроить их так, чтобы минимизировать файлы и дать им то же имя файла, но только при наличии соответствующего флага, например, ant productionDeploy
вместо ant интеграцииDeploy
. Таким образом, процесс минимизации полностью прозрачен для всего, кроме скрипта сборки.