У меня есть 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
настройку, а затем должны реплицировать истечение срока действия во многих различных областях конфигурации на своем месте.