Изменить заголовки http для конкретных URL с помощью HAProxy
Для конкретного URL-адреса я бы хотел установить заголовки контроля кэша для статических ресурсов, таких как /images/*
, /js/*
и т. д., который говорит браузеру использовать локальный кеш, скажем, 30 дней вместо загрузки новой версии. Как я могу сделать это через конфигурацию haproxy?
До того, как это будет неправильно понято, это не дубликат того, как кэшировать содержимое в HAProxy. Я просто хотел бы, чтобы haproxy добавлял заголовки к запросам для определенных ресурсов, сообщая браузеру использовать локальную кэшированную версию, если она доступна, но только для 1 конкретного домена.
2 ответа
Вероятно, вы могли бы выполнить это в одной строке, но это более понятно, как это:
frontend myfrontend
bind 0.0.0.0:80
default_backend default
acl cache_me path_dir /js
acl cache_me path_dir /images
use_backend cache if cache_me
backend default
server server1 1.2.3.4:80
backend cache
http-request set-header cache-control max-age="2592000"
server server1 1.2.3.4:80
Объяснение:
acl
Ключевое слово сообщает haproxy, что оно должно добавить запрос к определенному acl, если условие выполнено.
path_dir
соответствует подкаталогу, тогда как path
будет соответствовать всему пути. Может быть path_sub
лучше здесь, он ищет подстроку в пути.
use_backend
направляет запросы к определенному бэкэнду, если запрос находится в ACL. Все остальное идет в бэкэнд по умолчанию.
Таким образом, вы можете легко добавить дополнительные пути позже или даже направить эти запросы на другие серверы позже, если хотите.
Кроме того, фильтрация по домену:
frontend myfrontend
bind 0.0.0.0:80
default_backend default
acl cache_me path_dir /js
acl cache_me path_dir /images
acl domain1 hdr(host) -m sub example.com
use_backend cache if cache_me and domain1
backend default
server server1 1.2.3.4:80
backend cache
http-request set-header cache-control max-age="2592000"
server server1 1.2.3.4:80
frontend main
http-request set-var(txn.path) path
backend local
http-response set-header X-Robots-Tag noindex if { var(txn.path) -m end .pdf .doc }