Header Rewrite Plugin¶
This is a plugin for Apache Traffic Server that allows you to modify various headers based on defined rules (operations) on a request or response. Currently, only one operation is supported.
Using the plugin¶
This plugin can be used as both a global plugin, enabled in plugin.config:
header_rewrite.so config_file_1.conf config_file_2.conf ...
These are global rules, which would apply to all requests. Another option is to use per remap rules in remap.config:
map http://a http://b @plugin=header_rewrite.so @pparam=rules1.conf ...
In the second example, hooks which are not to be executed during the remap phase (the default) causes a transaction hook to be instantiated and used at a later time. This allows you to setup e.g. a rule that gets executed during the origin response header parsing, using READ_RESPONSE_HDR_HOOK.
Configuration filenames without an absolute paths are searched for in the default configuration directory. This is typically where your main configuration files are, e.g. /usr/local/etc/trafficserver.
Operators¶
The following operators are available:
rm-header header-name [operator_flags]
add-header header <value> [operator_flags]
set-header header <value> [operator_flags]
set-status <status-code> [operator_flags]
set-destination [qual] <value> [operator_flags]
set-redirect <status-code> <destination> [operator_flags]
set-timeout-out <value> [operator_flags]
set-status-reason <value> [operator_flags]
set-config overridable-config <value> [operator_flags]
set-conn-dscp <value> [operator_flags]
counter counter-name [operator_flags]
no-op [operator_flags]
Where qual is one of the support URL qualifiers:
HOST
PORT
PATH
QUERY
For example (as a remap rule):
cond %{HEADER:X-Mobile} = "foo"
set-destination HOST foo.mobile.bar.com [L]
Operator flags¶
The operator flags are optional, and must not contain whitespaces inside the brackets. Currently, only one flag is supported:
[L] Last rule, do not continue
[QSA] Append query string
Variable expansion¶
Currently only limited variable expansion is supported in add-header. Supported substitutions include:
%<proto> Protocol
%<port> Port
%<chi> Client IP
%<cqhl> Client request length
%<cqhm> Client HTTP method
%<cquup> Client unmapped URI
Conditions¶
The conditions are used as qualifiers: The operators specified will only be evaluated if the condition(s) are met:
cond %{STATUS} operand [condition_flags]
cond %{RANDOM:nn} operand [condition_flags]
cond %{ACCESS:file} [condition_flags]
cond %{TRUE} [condition_flags]
cond %{FALSE} [condition_flags]
cond %{HEADER:header-name} operand [condition_flags]
cond %{COOKIE:cookie-name} operand [condition_flags]
cond %{CLIENT-HEADER:header-name} operand [condition_flags]
cond %{PROTOCOL} operand [condition_flags]
cond %{HOST} operand [condition_flags]
cond %{TOHOST} operand [condition_flags]
cond %{FROMHOST} operand [condition_flags]
cond %{PATH} operand [condition_flags]
cond %{QUERY} operand [condition_flags]
cond %{INTERNAL-TRANSACTION} [condition_flags]
cond %{CLIENT-IP} [condition_flags]
The difference between HEADER and CLIENT-HEADER is that HEADER adapts to the hook it’s running in, whereas CLIENT-HEADER always applies to the client request header. The %{TRUE} condition is also the default condition if no other conditions are specified.
These conditions have to be first in a ruleset, and you can only have one in each rule. This implies that a new hook condition starts a new rule as well.:
cond %{READ_RESPONSE_HDR_HOOK} (this is the default hook)
cond %{READ_REQUEST_HDR_HOOK}
cond %{READ_REQUEST_PRE_REMAP_HOOK}
cond %{SEND_REQUEST_HDR_HOOK}
cond %{SEND_RESPONSE_HDR_HOOK}
For remap.config plugin instanations, the default hook is named REMAP_PSEUDO_HOOK. This can be useful if you are mixing other hooks in a configuration, but being the default it is also optional.
Condition flags¶
The condition flags are optional, and you can combine more than one into a comma separated list of flags. Note that whitespaces are not allowed inside the brackets:
[NC] Not case sensitive condition (when applicable) [NOT IMPLEMENTED!]
[AND] AND with next condition (default)
[OR] OR with next condition
[NOT] Invert this condition
Operands to conditions¶
/string/ # regular expression
<string # lexically lower
>string # lexically greater
=string # lexically equal
The absence of a “matcher” means value exists).
Values¶
Setting e.g. a header with a value can take the following formats:
- Any of the cond definitions, that extracts a value from the request
- $N 0 <= N <= 9, as grouped in a regular expression
- string (which can contain the above)
- null
Examples¶
cond %{HEADER:X-Y-Foobar}
cond %{COOKIE:X-DC} =DC1
add-header X-Y-Fiefum %{HEADER:X-Y-Foobar}
add-header X-Forwarded-For %<chi>
rm-header X-Y-Foobar
rm-header Set-Cookie
counter plugin.header_rewrite.x-y-foobar-dc1
cond %{HEADER:X-Y-Foobar} "Some string" [AND,NC]