UriPathRewriteFilter
Rewrite a URL path, using a bidirectional mapping:
- 
In the request flow,
fromPathis mapped totoPath. - 
In the response flow,
toPathis mapped tofromPath. 
PingGateway overwrites a response header only when all of the following conditions are true:
- 
The response includes a header such as
LocationorContent-Location - 
The URI of the response header matches the mapping
 - 
The value of response header is a relative path or its
scheme://host:portvalue matches the base URI. 
Usage
{
  "name": string,
  "type": "UriPathRewriteFilter",
  "config": {
    "mappings": object,
    "failureHandler": Handler reference
  }
}
Properties
"mappings": object, required- 
One or more bidirectional mappings between URL paths. You can find example mappings, request scenarios, and an example route in Examples.
{ "mappings": { "/fromPath1": "/toPath1", "/fromPath2": "/toPath2", ... } }Paths are given by a
configuration expression<string>. Consider the following points when you define paths:- 
The incoming URL must start with the mapping path.
 - 
When more than one mapping applies to a URL, the most specific mapping is used.
 - 
Duplicate
fromPathvalues are removed without warning. - 
Trailing slashes
/are removed from path values. - 
If the response includes a
LocationorContent-Locationheader with atoPathin its URL, the response is rewritten withfromPath. 
 - 
 "failureHandler": handler reference, optional- 
Failure handler to be invoked if an invalid URL is produced when the request path is mapped, or when the response
LocationorContent-Locationheader URI path is reverse-mapped.Provide an inline handler declaration, or the name of a handler object defined in the heap. See also PingGateway handlers.
Default: HTTP 500
 
Examples
Valid and invalid mapping examples
The following mapping examples are valid:
- 
Single
fromPathandtoPath"mappings": { "/fromPath1": "/toPath1", "/fromPath2": "/toPath2" } - 
Expressions in the
fromPathandtoPath"mappings": { "/${join(array(`fromPath`, 'path1'), `/`)}": "/${join(array(`toPath`, 'path2'), `/`)}" } - 
Expressions in the
fromPathandtoPaththat use predefined heap properties"mappings": { "${fromPath}": "${toPath}" } - 
No mappings—the configuration is valid, but has no effect
"mappings": { } - 
Duplicate
toPath"mappings": { "/fromPath1": "/toPath", "/fromPath2": "/toPath" } - 
Duplicate
fromPath—the configuration is overwritten without warning"mappings": { "/fromPath": "/toPath1", "/fromPath": "/toPath2" } 
The following mapping examples aren’t valid
- 
No
toPath"mappings": { "/fromPath": "" }"mappings": { "/fromPath": "${unknown}" } - 
Invalid
toPath"mappings": { "/fromPath": "${invalidExpression}" } - 
No
fromPath"mappings": { "": "/toPath" }"mappings": { "${unknown}": "/toPath" } - 
Invalid
fromPath"mappings": { "${invalidExpression}": "/toPath" } 
Example request scenarios
| Description | Mapping | Inbound URI | Rewritten URI | 
|---|---|---|---|
Basic path  | 
 | 
https://example.com/fromPath/remainder  | 
https://example.com/toPath/remainder  | 
Root context, where the inbound request URI has a   | 
 | 
https://example.com/  | 
https://example.com/rootcontext/  | 
Root context, where the inbound URI has a   | 
 | 
https://example.com/rootcontext/  | 
https://example.com/  | 
Root context, where the inbound request URI has an empty path  | 
 | 
https://example.com  | 
https://example.com/rootcontext  | 
Root context, where the rewritten URI has an empty path  | 
 | 
https://example.com/rootcontext  | 
https://example.com  | 
Root context, with path remainder  | 
 | 
https://example.com/remainder  | 
https://example.com/rootcontext/remainder  | 
Root context, with path remainder  | 
 | 
https://example.com/rootcontext/remainder  | 
https://example.com/remainder  | 
Root context, where the trailing   | 
 | 
https://example.com/remainder  | 
https://example.com/rootcontext/remainder  | 
Path with dot-segments:  | 
 | 
https://example.com/fromPath  | 
https://example.com/toPath1/../toPath2  | 
Path with syntax:  | 
 | 
https://example.com/fromPath;v=1.1  | 
https://example.com/toPath,1.1  | 
Path with syntax:  | 
 | 
https://example.com/$fromPath  | 
https://example.com/$toPath  | 
Path with query parameters  | 
 | 
https://example.com/fromPath?param1¶m2=2  | 
https://example.com/toPath?param1¶m2=2  | 
Path with fragment  | 
 | 
https://example.com/fromPath#fragment  | 
https://example.com/toPath#fragment  | 
Example route
The example route changes a request URL as follows:
- 
The
baseURIoverrides the scheme, host, and port of a request URL. - 
The UriPathRewriteFilter remaps the path of a request URL.
Requests to
https://ig.example.com:8443/myloginare mapped tohttps://app.example.com:8444/login.Requests to
https://ig.example.com:8443/welcomeare mapped tohttps://app.example.com:8444/home.Requests to
https://ig.example.com:8443/otherare mapped tohttps://app.example.com:8444/not-found, and result in an HTTP 404.Requests to
https://ig.example.com:8443/badurlare mapped to the invalid URLhttps://app.example.com:8444[, and invoke the failure handler. 
{
  "name": "UriPathRewriteFilter",
  "baseURI": "https://app.example.com:8444",
  "handler": {
    "type": "Chain",
    "config": {
      "filters": [
        {
          "type": "UriPathRewriteFilter",
          "config": {
            "mappings": {
              "/mylogin": "/login",
              "/welcome": "/home",
              "/other": "/not-found",
              "/badurl": "["
            },
            "failureHandler": {
              "type": "StaticResponseHandler",
              "config": {
                "status": 500,
                "headers": {
                  "Content-Type": [
                    "text/plain"
                  ]
                },
                "entity": "Invalid URL produced"
              }
            }
          }
        }
      ],
      "handler": {
        "type": "ClientHandler",
        "config": {
          "tls": {
            "type": "ClientTlsOptions",
            "comment": "Blindly trust the gateway certificate",
            "config": {
              "trustManager": {
                "type": "TrustAllManager"
              },
              "hostnameVerifier": "ALLOW_ALL"
            }
          }
        }
      }
    }
  }
}
Source: UriPathRewriteFilter.json