response-rewrite

Description

The response-rewrite Plugin rewrites the content returned by the Upstream and APISIX.

This Plugin can be useful in these scenarios:

  • To set Access-Control-Allow-* field for supporting CORS.
  • To set custom status_code and Location fields in the header to redirect.
response-rewrite - 图1tip

You can also use the redirect Plugin to setup redirects.

Attributes

NameTypeRequiredDefaultValid valuesDescription
status_codeintegerFalse[200, 598]New HTTP status code in the response. If unset, falls back to the original status code.
bodystringFalseNew body of the response. The content-length would also be reset.
body_base64booleanFalsefalseWhen set, the body of the request will be decoded before writing to the client.
headersobjectFalseNew headers for the response. Headers are overwritten if they are present in the Upstream response otherwise, they are added to the Upstream headers. To remove a header, set the header value to an empty string. The values in the header can contain Nginx variables like $remote_addr and $balancer_ip.
varsarray[]FalseSee lua-resty-expr for a list of available operators.Nginx variable expressions to conditionally execute the rewrite. The Plugin will be executed unconditionally if this value is empty.
filtersarray[]FalseList of filters that modify the response body by replacing one specified string with another.
filters.regexstringTrueRegex pattern to match on the response body.
filters.scopestringFalse“once”“once”,”global”Range to substitute. once substitutes the first match of filters.regex and global does global substitution.
filters.replacestringTrueContent to substitute with.
filters.optionsstringFalse“jo”Regex options. See ngx.re.match.
response-rewrite - 图2note

Only one of body or filters can be configured.

Enabling the Plugin

The example below enables the response-rewrite Plugin on a specific Route:

  1. curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  2. {
  3. "methods": ["GET"],
  4. "uri": "/test/index.html",
  5. "plugins": {
  6. "response-rewrite": {
  7. "body": "{\"code\":\"ok\",\"message\":\"new json body\"}",
  8. "headers": {
  9. "X-Server-id": 3,
  10. "X-Server-status": "on",
  11. "X-Server-balancer_addr": "$balancer_ip:$balancer_port"
  12. },
  13. "vars":[
  14. [ "status","==",200 ]
  15. ]
  16. }
  17. },
  18. "upstream": {
  19. "type": "roundrobin",
  20. "nodes": {
  21. "127.0.0.1:80": 1
  22. }
  23. }
  24. }'

Here, vars is configured to run the Plugin only on responses with a 200 status code.

Example usage

Once you have enabled the Plugin as shown above, you can make a request:

  1. curl -X GET -i http://127.0.0.1:9080/test/index.html

The response will be as shown below no matter what the response is from the Upstream:

  1. HTTP/1.1 200 OK
  2. Date: Sat, 16 Nov 2019 09:15:12 GMT
  3. Transfer-Encoding: chunked
  4. Connection: keep-alive
  5. X-Server-id: 3
  6. X-Server-status: on
  7. X-Server-balancer_addr: 127.0.0.1:80
  8. {"code":"ok","message":"new json body"}
response-rewrite - 图3IMPORTANT

ngx.exit will interrupt the execution of a request and returns its status code to Nginx.

However, if ngx.exit is executed during an access phase, it will only interrupt the request processing phase and the response phase will still continue to run.

So, if you have configured the response-rewrite Plugin, it do a force overwrite of the response.

ngx.edit tabular overview

Disable Plugin

To disable the response-rewrite Plugin, you can delete the corresponding JSON configuration from the Plugin configuration. APISIX will automatically reload and you do not have to restart for this to take effect.

  1. curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  2. {
  3. "methods": ["GET"],
  4. "uri": "/test/index.html",
  5. "upstream": {
  6. "type": "roundrobin",
  7. "nodes": {
  8. "127.0.0.1:80": 1
  9. }
  10. }
  11. }'