Правила Content Modification¶
Введение¶
Правила Content Modification позволяют администраторам определять точные действия для изменения HTTP-запросов и ответов. Эти действия организованы в именованные списки (группы модификации) и могут применяться условно с использованием логических правил, аналогичных правилам Content Switch.
Правила определяются в контексте vlb service и указывают на группу модификаций. Каждая группа содержит действия, применяемые к HTTP-заголовкам, куки или путям запросов.
Чтобы определить правила в WEB, перейдите в раздел Service, нажмите кнопку Edit рядом с нужным сервисом, далее на кнопку Add в разделе Content Modification Rules.
Поля 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.
Каждая операция начинается с action и идентификатора. Идентификатор не влияет на порядок выполнения операций.
Доступные операции:
request path set value VALUE...request header delete name NAMErequest header set name NAME value VALUE...request cookie delete name NAMErequest cookie set name NAME value VALUE...response header delete name NAMEresponse header set name NAME value VALUE...response cookie delete name NAMEresponse 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.
Если нужно применять модификации безусловно, то можно опустить условие 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.Если определено несколько операций изменения пути, применяется только первая.