Правила Content Modification

Введение

Правила Content Modification позволяют администраторам определять точные действия для изменения HTTP-запросов и ответов. Эти действия организованы в именованные списки (группы модификации) и могут применяться условно с использованием логических правил, аналогичных правилам Content Switch.

Правила определяются в контексте vlb service и указывают на группу модификаций. Каждая группа содержит действия, применяемые к HTTP-заголовкам, куки или путям запросов.

Чтобы определить правила в WEB, перейдите в раздел Service, нажмите кнопку Edit рядом с нужным сервисом, далее на кнопку Add в разделе Content Modification Rules.

Adding Content Modification Rule

Поля ID и HTTP modification group обязательны.

В поле Expression задайте условие, при выполнении которого будут применены действия из группы модификации.

Используйте переменные, чтобы записать условие.

Если нужно выполнить правило модификации контента без применения условия, то не заполняйте поле Expression.

Основные понятия

Действия, применяемые к HTTP-запросам и/или ответам, группируются в именованные списки, доступные в секции vlb http-modification-group <NAME>:

vlb http-modification-group mg
  action 1 request path set value /index.html
  action 2 request header delete name test
  action 3 response cookie set name foo value var
exit

Чтобы добавить группу модификации контента в WEB, перейдите в раздел HTTP Modification Rules и нажмите кнопку Add.

Adding Content Modification group
Adding Content Modification group

Каждая операция начинается с action и идентификатора. Идентификатор не влияет на порядок выполнения операций.

Доступные операции:

  • request path set value VALUE...

  • request header delete name NAME

  • request header set name NAME value VALUE...

  • request cookie delete name NAME

  • request cookie set name NAME value VALUE...

  • response header delete name NAME

  • response header set name NAME value VALUE...

  • response cookie delete name NAME

  • response cookie set name NAME value VALUE...

Правила модификации определяются в секции vlb service:

vlb service srv
  default-target-group tg
  http content-modification rule 1 http-modification-group mg if $header['fooo'] == 'booo'
  access-point type http ip 192.168.100.102/32 port 80
exit

где правило

http content-modification rule 1 http-modification-group mg if $header['fooo'] == 'booo'

означает: применить все действия из группы mg, если условие $header['fooo'] == 'booo' истинно.

Синтаксис условий такой же, как в правилах Content Switching.

Example of Content Modification group
Example of Content Modification Rule

Если нужно применять модификации безусловно, то можно опустить условие if:

http content-modification rule 1 http-modification-group mg

Срабатывание нескольких правил

Как и в случае с Content Switching, правила обрабатываются в порядке возрастания ID. Однако, в отличие от Content Switching, обработка правил не прекращается после первого совпадения.

Это означает, что может быть применено несколько правил, в результате чего будут использованы несколько групп модификаций.

Чтобы прекратить обработку правил после применения текущей группы, используйте директиву break внутри секции vlb http-modification-group (или выберите yes в поле Break в WEB-интерфейсе):

vlb http-modification-group mg1
  action 1 request header set name mg1 value group1
  break
exit

vlb http-modification-group mg2
  action 1 request header set name mg2 value group2
exit

vlb service srv
  default-target-group tg
  http content-modification rule 1 http-modification-group mg1 if $header['aaa'] == 'bbb'
  http content-modification rule 2 http-modification-group mg2 if $header['ccc'] == 'ddd'
  access-point type http ip 192.168.100.102/32 port 80
exit

В этом примере, если оба условия $header['aaa'] == 'bbb' и $header['ccc'] == 'ddd' истинны, то будут выполнены только действия из группы mg1. Второе правило будет пропущено из-за break в группе mg1.

Если вы удалите break (или измените порядок идентификаторов правил), то оба набора действий будут применены.

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

По умолчанию ADC заменяет значение заголовка, если он уже существует во входящем HTTP-запросе. Для добавления значения к существующему заголовку поле значения заголовка должно начинаться с префикса $add:

action 1 request header set name X-Real-IP value $add:$remote_addr
action 2 request header set name X-Forwarded-For value $add:$x_forwarded_for

Если несколько операций set направлены на один и тот же заголовок, все они будут добавлены. Исходные заголовки с этим именем будут удалены первыми.

Например, эти операции добавят оба заголовка с именем foo, предварительно удалив все существующие заголовки с этим именем:

action 1 request header set name foo value bar
action 2 request header set name foo value baz

Примечания

  • Порядок выполнения действий модификации не строго определён. Идентификаторы действий не влияют на порядок выполнения.

  • Однако операции удаления всегда выполняются перед всеми остальными, независимо от их положения.

  • Условия правил проверяются только для запросов. Ответы не участвуют в оценке условий.

  • Переменные доступны только в своём контексте (запрос/ответ). Например, $x_forwarded_for не может быть использован в модификациях заголовков ответа, так как заголовок X-Forwarded-For существует только в запросе.

  • Каждая модификация уникально идентифицируется комбинацией направления (запрос/ответ), цели (заголовок/куки), имени и значения. Если две команды различаются по любому из этих полей, они считаются отдельными и не заменяют друг друга. Например, если вы введете команды request header set name foo value bar и request header set name foo value baz, обе записи будут добавлены, но вторая не заменит первую. Соответственно, чтобы удалить ее, напишите всю строку: no request header set name foo value bar.

  • Если определено несколько операций изменения пути, применяется только первая.