Назад | Перейти на главную страницу

Установить политику кеширования для перезаписанного запроса

у меня есть 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