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

Установка разных заголовков кеширования для разных перенаправлений с помощью Apache mod_rewrite

У меня есть vhost Apache, который выполняет ряд операций перезаписи (с использованием mod_rewrite) на запрошенных URL-адресах. Некоторые из этих вызовов RewriteRule перенаправляют браузер на другие хосты (используя перенаправления 301 и 302).

Я установил истечение срока действия по умолчанию в 1 секунду в этом файле vhost:

ExpiresActive On
ExpiresDefault "access plus 1 second"

и, соответственно, все перенаправления включают этот заголовок:

Cache-Control: max-age=1

Теперь я пытаюсь вывести другой заголовок кеширования в случае одного конкретного перенаправления. Я хочу, чтобы большинство перенаправлений (302) продолжали иметь срок действия в 1 секунду, но для одного из них (301) я бы хотел использовать вместо этого срок действия в 1 день.

Это выполнимо?

Есть способ сделать это, но не с помощью mod_expires. Вместо этого вы должны установить переменную среды с помощью mod_rewrite, а затем условно добавить правильные заголовки кеширования с помощью mod_headers, как описано в Марк С. Колич: Установите заголовки Cache-Control и Expires при перенаправлении с помощью mod_rewrite.

Итак, мое окончательное решение выглядит так:

RewriteRule ... [last,redirect=301,env=longexpiry:1]
RewriteRule ... [last,redirect=302,env=nocache:1]

Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache
Header always set Cache-Control "max-age=86400" env=longexpiry

Убедитесь, что у вас нет срока действия по умолчанию, установленного mod_expires, иначе вы получите дублирующиеся заголовки.

Расширяя ответ @Francois Marier, мне нужно было правило перезаписи, которое выглядит следующим образом без перенаправления 30X:

RewriteRule ^version/[0-9a-z\-]*/(.*)$ /foo/$1 [E=versioncache:1]

И поскольку я хотел использовать versioncache в Header set Правило, это должно быть:

Header always set Cache-Control "max-age=86400" env=REWRITE_versioncache

Как ты думаешь, как долго мне нужно понять, почему очевидное ... env=versioncache не сработало? Благодаря этот ответ для подсказки о добавлении apache REWRITE_.

Для этого вам нужно создать другой виртуальный хост с другими настройками, а для перенаправлений, которые вы хотите использовать в «этой ситуации», вместо этого используйте этот vHost. Это не PHP-код, это язык Apache. Сожалею. Нет никаких «если-то».

Вы можете попробовать использовать SetEnvIf директива от Apache mod_setenvif. Примерно так (не проверено):

SetEnvIf Request_URI \.gif EXPIRES1DAY
Header set Cache-Control max-age=86400 env=EXPIRES1DAY

Один из способов решения этой проблемы без удаления срока действия по умолчанию, установленного mod_expires, - это добавить <Location> блокировка для URL-адреса, который перенаправляется. Допустим, вы перенаправляете в папку с версией и периодически меняете эту версию:

RewriteRule ^/approot/(.*)  /approot.1.2.3.4/$1 [R=307,L]

Если вы не хотите, чтобы это перенаправление кэшировалось (но вы хотите, чтобы кешировалось фактическое содержимое), просто добавьте этот блок в свою конфигурацию:

<Location /approot>
    ExpiresActive Off
</Location>

Конечно, "/approot"представляет любой URL-адрес, который вы перенаправляете.

Просто и легко. Вам не нужно возиться с уже работающей конфигурацией mod_expires. Вам не нужно пытаться добавлять или удалять заголовки с помощью mod_headers. Вы просто указываете mod_expires не добавлять заголовки для URL-адреса, который вы перенаправляете.

Сначала я попробовал принятый ответ выше (от Francois Marier), но он не сработал, потому что я не хотел отключать ExpiresDefault настройку, а затем должны реплицировать истечение срока действия во многих различных областях конфигурации на своем месте.