у меня есть RewriteRule
который перезаписывает любой запрос файла, содержащего часть управления версиями, в файл без версии:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.[0-9a-f]{32}(\.[0-9a-z]{2,6})$ $1$2 [L]
Это означает, что всякий раз, когда файл styles.<version-id>.css
запрашивается, он переписывается на styles.css
. Теперь, как я могу установить заголовки кеша, чтобы файл кэшировался в течение более длительного периода времени, если запрашивается версионная версия файла?
Другими словами, если файл styles.css
запрашивается, его нужно кэшировать на 24 часа, пока файл styles.<version-id>.css
должны храниться в кэше 365 дней.
Я пробовал настроить кеш, используя FilesMatch
как до, так и после перезаписи с использованием этого фрагмента:
<FilesMatch ".+\.[0-9a-f]{32}\.[0-9a-z]{2,6}">
Header set Cache-Control "max-age=31536000, public"
</FilesMatch>
Но не работает. Может, не совпадает, потому что имя файла переписано. Я не знаю.
Я также пробовал использовать переменные среды:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.[0-9a-f]{32}(\.[0-9a-z]{2,6})$ $1$2 [L,E=AutoVersion]
Header set Cache-Control "max-age=31536000, public" env=AutoVersion
Но я тоже не могу заставить это работать.
Есть ли способ установить политику кэширования перезаписанного запроса на основе исходного запроса?
<FilesMatch>
соответствует физическим файлам (не URL-адресам), поэтому никогда не будет соответствовать URL формы styles.<version-id>.css
, где физический файл styles.css
.
<LocationMatch>
(в конфигурации сервера) является эквивалентом для URL-адресов, но вы переписываете URL-адрес и <Location[Match]>
обертки применяются поздно, поэтому, опять же, это никогда не будет совпадать.
(Основываясь на формате и поведении этих директив, я предполагаю, что эти директивы находятся в каталоге /.htaccess
контекст, а не непосредственно в конфигурации сервера / виртуального хоста?)
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)\.[0-9a-f]{32}(\.[0-9a-z]{2,6})$ $1$2 [L,E=AutoVersion] Header set Cache-Control "max-age=31536000, public" env=AutoVersion
Но вы можете сделать это с помощью mod_rewrite для установки переменной окружения - так же, как вы это сделали. Это работало бы практически как есть, если бы использовалось непосредственно в конфигурации сервера. (Кроме этого REQUEST_FILENAME
нужно будет изменить на LA-U:REQUEST_FILENAME
функционировать по назначению, в противном случае RewriteCond
директива будет всегда оценить верно.)
Однако в контексте каждого каталога процесс перезаписи начинается заново после первоначальной перезаписи, а переменные среды получают префикс REDIRECT_
(исходная переменная среды не сохраняется). Итак, вам просто нужно изменить свой Header
директива, чтобы проверить это переименован вместо этого переменная окружения. Например:
Header set Cache-Control "max-age=31536000, public" env=REDIRECT_AutoVersion