Configuring Request Transformation

1. Transforming Request Headers

OperationExample
AddX-Internal-Auth: secret
RemoveStrip X-Forwarded-Host
RenameX-Api-KeyX-Internal-Key
ReplaceOverwrite if present
AppendMulti-value header

Example: Kong request-transformer

plugins:
  - name: request-transformer
    config:
      add:
        headers: ["X-Internal-Trace:$(uuid)", "X-Source:gateway"]
      remove:
        headers: ["X-Debug-Token"]
      rename:
        headers: ["X-Old-Auth:X-New-Auth"]

2. Using Path Rewriting Rules

Example: Strip prefix, rewrite

location /api/v1/ {
  rewrite ^/api/v1/(.*)$ /$1 break;
  proxy_pass http://backend;
}
# /api/v1/users → backend/users
DirectiveEffect
strip_pathRemove matched prefix
rewrite regexPattern substitution
prefix_rewriteReplace start of path

3. Implementing Query Parameter Transformation

OpExample
Add?tenant=acme
RemoveStrip ?debug
Renamepageoffset
TransformPage number → offset math

4. Modifying Request Body

Example: JSON body enrichment

local cjson = require "cjson"
local body = cjson.decode(kong.request.get_raw_body())
body.tenant_id = kong.ctx.shared.tenant
body.received_at = ngx.now()
kong.service.request.set_raw_body(cjson.encode(body))

5. Converting Request Methods

FromToUse Case
POSTPUTLegacy client compat
GET ?_method=DELETEDELETEFirewall restrictions
PATCHPUTBackend doesn't support PATCH

6. Setting Default Request Values

Example: Default query and body

plugins:
  - name: request-transformer
    config:
      add:
        querystring: ["page=1", "limit=20"]
        body: ["source=api-gateway"]

7. Using Template-Based Transformation

Template EngineSyntax
Mustache{{ headers.host }}
Jinja2{% if ... %}
Envoy CELrequest.headers["x-id"]
JSONataFunctional JSON transform

8. Implementing Request Enrichment

Example: Inject user context from JWT

local jwt = kong.ctx.shared.jwt_payload
kong.service.request.set_header("X-User-Id", jwt.sub)
kong.service.request.set_header("X-User-Roles", table.concat(jwt.roles, ","))
kong.service.request.set_header("X-Tenant-Id", jwt.tenant)

9. Configuring Content Encoding

EncodingWhen
gzip on uploadReduce bandwidth
Decode for inspectionWAF body scan
Re-encode for backendBackend wants raw

10. Setting Up Request Mapping Rules

MappingExample
Header → QueryX-Region?region=
JWT claim → HeadersubX-User-Id
Path param → Body/users/:id{"id":...}
Query → BodyFor GET-to-POST conversion