Apache: устанавливать глобальные заголовки, только если они еще не установлены
У меня здесь немного раздражающая ситуация.
У меня есть сервер, управляемый Plesk. В /etc/apache2/apache2.conf происходит конфигурирование на основе mod_headers и mod_expires. Например:
<filesMatch "\.(jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=604800, public"
</filesMatch>
Это работает довольно хорошо.
У меня проблема с некоторыми из моих приложений. Я хочу, чтобы приложение сохраняло контроль над кешем, если захочет. В настоящее время это невозможно, поскольку настройки заголовка выполняются непосредственно перед возвратом ответа клиенту, то есть после того, как приложение завершило все свои действия. Заголовки, установленные приложением, будут перезаписаны.
Header merge Cache-Controll...
не работает, хотя, потому что он просто добавляет данную строку заголовка. И я сомневаюсь, что браузеры будут обрабатывать заголовки, подобные этому, как я хотел бы, чтобы они:
Cache-Control max-age=0, no-cache, no-store, must-revalidate, max-age=604800, public
Мой вопрос сейчас: есть ли возможность установить заголовок, только если в определенном заголовке "поле" абсолютно нет содержимого? Я не хочу, чтобы мое приложение устанавливало какие-либо переменные среды, потому что приложение не должно изменяться в соответствии с потребностями одного сервера.
Я также попытался - только для целей тестирования - сбросить заголовок через vhost.conf для конкретного домена. Но он выполняется до установки заголовка в apache2.conf, что означает, что они также будут перезаписаны.
2 ответа
Я думаю, что вы можете осуществить это, используя Header edit
, Секретный соус - это отрицательное прогнозное утверждение:
Header edit Cache-control "^(?!.*max-age.*)(.*)" "max-age=604800,\1"
Идея в том, что ^(?!.*max-age.*)(.*)
соответствует началу значения заголовка, если строка max-age
не существует нигде в шапке. Если совпадение выполнено успешно (то есть "max-age" еще не существует), оно вставляет "max-age=604800", а затем остальную часть исходного заголовка.
РЕДАКТИРОВАТЬ: Apache использует PCRE, поэтому вам может понадобиться $1
вместо \1
в строке замены.
Apache 2.4.7:
Header setifempty Access-Control-Allow-Origin "*"
Apache 2.2.4 ниже
Header append Access-Control-Allow-Origin ""
Header edit Access-Control-Allow-Origin "^$" "*"