Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. HTTP rewrite и модификация
http_rewrite

HTTP rewrite и модификация

reqadd, reqdel, http-request set-header, URL rewriting

HTTP Rewrite и модификация в HAProxy

HAProxy позволяет модифицировать HTTP запросы и ответы: добавлять/удалять заголовки, переписывать URL, изменять body.

#Модификация запросов

#http-request set-header

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 — добавить заголовок (не удалять существующий)

#http-request set-query

frontend http_front bind *:80 # Переписать query string http-request set-query version=1&user=%[src] default_backend web_servers

Использование:

  • Добавление API version
  • Добавление tracking параметров

#http-request set-path

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

#http-request set-uri

frontend http_front bind *:80 # Полная перезапись URI http-request set-uri /new-path%[query] default_backend web_servers

#Удаление заголовков

#http-request del-header

frontend http_front bind *:80 # Удалить заголовок http-request del-header X-Powered-By http-request del-header Server default_backend web_servers

Зачем:

  • Security through obscurity
  • Удаление внутренних заголовков

#http-request unset-header

frontend http_front bind *:80 # Удалить если существует http-request unset-header X-Internal-Debug default_backend web_servers

#Добавление заголовков

#http-request add-header

frontend http_front bind *:80 # Добавить заголовок (сохранить существующие) http-request add-header X-Forwarded-By HAProxy default_backend web_servers

Отличие от set-header:

  • add-header — добавляет ещё один заголовок (может быть несколько)
  • set-header — заменяет существующий

#Conditional модификация

#С условиями ACL

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_servers

#С regexp

frontend http_front bind *:80 # Добавить заголовок если path соответствует pattern http-request set-header X-Resource-Type api if { path -m regex ^/api/ } default_backend web_servers

#Модификация ответов

#http-response set-header

backend 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 check

#http-response del-header

backend web_servers # Удалить заголовки сервера http-response del-header X-Powered-By http-response del-header Server server web1 192.168.1.10:8080 check

#http-response add-header

backend web_servers # Добавить cookie http-response add-header Set-Cookie "SESSIONID=%[uuid()]; Path=/; HttpOnly" server web1 192.168.1.10:8080 check

#URL Rewriting

#redirect prefix

frontend 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

#redirect location

frontend http_front bind *:80 # Полный redirect http-request redirect location https://example.com%[path] if !{ ssl_fc } default_backend web_servers

#http-request set-path с regexp

frontend http_front bind *:80 # Заменить /old/ на /new/ http-request set-path %[path,regsub(^/old/,/new/)] default_backend web_servers

#Работа с body

#Compression

backend 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 типы для сжатия

#Buffer tuning

global tune.bufsize 16384 tune.maxrewrite 1024

Параметры:

  • tune.bufsize — размер буфера для заголовков
  • tune.maxrewrite — буфер для rewrite операций

#Переменные и fetches

#Встроенные переменные

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()]

#Fetches

# Из заголовка 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]

#Full Example: API Gateway

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

#Troubleshooting

#Проверка заголовков

# Запрос с 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)]"

#Best Practices

#Именование заголовков

# Хорошо (стандартные имена) 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,/)]

Далее: Компрессия и кэширование