reqadd, reqdel, http-request set-header, URL rewriting
HAProxy позволяет модифицировать HTTP запросы и ответы: добавлять/удалять заголовки, переписывать URL, изменять body.
frontend http_front
bind *:80
# Добавить заголовок
http-request set-header X-Forwarded-Proto http
http-request set-header X-Real-IP %[src]
# Добавить заголовок с переменной
http-request set-header X-Request-ID %[uuid()]
default_backend web_serversПараметры:
set-header — установить заголовок (перезаписать если есть)add-header — добавить заголовок (не удалять существующий)frontend http_front
bind *:80
# Переписать query string
http-request set-query version=1&user=%[src]
default_backend web_serversИспользование:
frontend http_front
bind *:80
# Переписать path
http-request set-path /api/v1%[path]
default_backend web_serversПример:
GET /users → /api/v1/users
GET /orders → /api/v1/orders
frontend http_front
bind *:80
# Полная перезапись URI
http-request set-uri /new-path%[query]
default_backend web_serversfrontend http_front
bind *:80
# Удалить заголовок
http-request del-header X-Powered-By
http-request del-header Server
default_backend web_serversЗачем:
frontend http_front
bind *:80
# Удалить если существует
http-request unset-header X-Internal-Debug
default_backend web_serversfrontend http_front
bind *:80
# Добавить заголовок (сохранить существующие)
http-request add-header X-Forwarded-By HAProxy
default_backend web_serversОтличие от set-header:
add-header — добавляет ещё один заголовок (может быть несколько)set-header — заменяет существующийfrontend http_front
bind *:80
acl is_api path_beg /api
acl is_mobile hdr_sub(User-Agent) -i mobile
# Добавить только для API
http-request set-header X-API-Version 2 if is_api
# Добавить только для мобильных
http-request set-header X-Mobile-Optimized true if is_mobile
default_backend web_serversfrontend http_front
bind *:80
# Добавить заголовок если path соответствует pattern
http-request set-header X-Resource-Type api if { path -m regex ^/api/ }
default_backend web_serversbackend web_servers
# Security headers
http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains"
http-response set-header X-Frame-Options "SAMEORIGIN"
http-response set-header X-Content-Type-Options "nosniff"
http-response set-header X-XSS-Protection "1; mode=block"
# Custom headers
http-response set-header X-Powered-By HAProxy
http-response set-header Server nginx
server web1 192.168.1.10:8080 checkbackend web_servers
# Удалить заголовки сервера
http-response del-header X-Powered-By
http-response del-header Server
server web1 192.168.1.10:8080 checkbackend web_servers
# Добавить cookie
http-response add-header Set-Cookie "SESSIONID=%[uuid()]; Path=/; HttpOnly"
server web1 192.168.1.10:8080 checkfrontend http_front
bind *:80
# Добавить префикс
redirect prefix /api/v2 code 301 if { path_beg /api }
default_backend web_serversПример:
GET /api/users → 301 → /api/v2/api/users
frontend http_front
bind *:80
# Полный redirect
http-request redirect location https://example.com%[path] if !{ ssl_fc }
default_backend web_serversfrontend http_front
bind *:80
# Заменить /old/ на /new/
http-request set-path %[path,regsub(^/old/,/new/)]
default_backend web_serversbackend web_servers
compression algo gzip
compression type text/html text/plain text/css application/json application/javascript
server web1 192.168.1.10:8080 checkПараметры:
compression algo gzip — алгоритм сжатияcompression type — MIME типы для сжатияglobal
tune.bufsize 16384
tune.maxrewrite 1024Параметры:
tune.bufsize — размер буфера для заголовковtune.maxrewrite — буфер для rewrite операцийhttp-request set-header X-Real-IP %[src]
http-request set-header X-Client-Port %[src_port]
http-request set-header X-Server-Port %[dst_port]
http-request set-header X-Request-ID %[uuid()]
http-request set-header X-Timestamp %[date()]# Из заголовка
http-request set-header X-User-ID %[hdr(X-Auth-User-ID)]
# Из cookie
http-request set-header X-Session-ID %[req.cooki(SESSIONID)]
# Из path
http-request set-header X-Resource-Type %[path,word(1,/)]
# URL encoded
http-request set-header X-Original-Path %[path,urlenc]frontend api_front
bind *:80
# === Security ===
acl is_api path_beg /api
acl has_auth hdr(Authorization) -m found
http-request deny deny_status 401 if is_api !has_auth
# === Headers для backend ===
http-request set-header X-Real-IP %[src]
http-request set-header X-Forwarded-Proto http
http-request set-header X-Request-ID %[uuid()]
http-request set-header X-Timestamp %[date()]
# === Versioning ===
acl is_v1 path_beg /api/v1
acl is_v2 path_beg /api/v2
http-request set-header X-API-Version 1 if is_v1
http-request set-header X-API-Version 2 if is_v2
# === Rate limiting ===
stick-table type ip size 100k expire 30s store http_req_rate(10s)
http-request track-sc0 src
acl is_rate_limited sc_http_req_rate(0) gt 100
http-request deny deny_status 429 if is_rate_limited
# === Routing ===
use_backend api_v1_servers if is_v1
use_backend api_v2_servers if is_v2
default_backend api_v1_servers
backend api_v1_servers
# === Security headers в ответе ===
http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains"
http-response set-header X-Frame-Options "SAMEORIGIN"
http-response set-header X-Content-Type-Options "nosniff"
# === Удаление заголовков ===
http-response del-header X-Powered-By
http-response del-header Server
server api1 192.168.1.10:8080 check
backend api_v2_servers
http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains"
http-response set-header X-Frame-Options "SAMEORIGIN"
http-response set-header X-Content-Type-Options "nosniff"
server api2 192.168.1.20:8080 check# Запрос с verbose
curl -v http://example.com/
# Показать только заголовки
curl -I http://example.com/
# Показать запрос и ответ
curl -v -X POST -H "X-Custom: test" http://example.com/# Логирование заголовков
log-format "%ci:%cp %ft %b/%s %ST %B %{+Q}r X-Request-ID=%[req.hdr(X-Request-ID)]"# Хорошо (стандартные имена)
http-request set-header X-Real-IP %[src]
http-request set-header X-Forwarded-Proto https
# Плохо (нестандартные)
http-request set-header X-My-Custom-Header-1 value# 1. ACL проверки
acl is_api path_beg /api
# 2. Deny/Redirect
http-request deny if !has_auth
# 3. Модификация запросов
http-request set-header X-Real-IP %[src]
# 4. Routing
use_backend api_servers if is_api# Избегайте сложных regexp в hot path
# Плохо (медленно)
http-request set-header X-Type %[path,regsub(^/api/v[0-9]+/(.*)/,\\1/)]
# Хорошо (быстро)
http-request set-header X-Type %[path,word(2,/)]http-request set-header — модификация запросовhttp-response set-header — модификация ответовredirect — URL редиректы%[src], %[uuid()]) для динамических значенийИзучим компрессию и кэширование в HAProxy.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.