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

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, что означает, что они также будут перезаписаны.

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 "^$" "*"

Я думаю, вы можете справиться с этим, используя Header edit. Секретный соус - это опровергнутое прогнозное утверждение:

Header edit Cache-control "^(?!.*max-age.*)(.*)" "max-age=604800,\1"

Идея в том, что ^(?!.*max-age.*)(.*) соответствует началу значения заголовка, если строка max-age нигде в шапке нет. Если совпадение успешно (что означает «максимальный возраст» еще не существует), он вставляет «max-age = 604800», за которым следует остальная часть исходного заголовка.

РЕДАКТИРОВАТЬ: Apache использует PCRE, поэтому вам может потребоваться $1 вместо того \1 в строке замены.