Rules are more powerful when they respond to different criteria set for the client requests. To do so, the rule needs to specify children
containing an array of nested rule objects. Along with a descriptive name
, child rules may contain an additional set of criteria
objects that determine when its behaviors
execute.
In this example, the child rule's contentType
criteria matches requests for common HTML, CSS, and JavaScript files, and applies the gzipResponse
behavior to compress them.
{
"rules": {
"name": "default",
"options": {
"is_secure": false
},
"behaviors": [
{
"name": "origin",
"options": {
"originType": "CUSTOMER",
"hostname": "example.com",
"forwardHostHeader": "REQUEST_HOST_HEADER",
"cacheKeyHostname": "ORIGIN_HOSTNAME",
"compress": true,
"tcipEnabled": false,
"httpPort": 80
}
},
{
"name": "cpCode",
"options": {
"value": {
"id": 12345,
"name": "main site"
}
}
}
],
"children": [
{
"name": "Compress Text Content",
"criteria": [
{
"name": "contentType",
"options": {
"matchOperator": "IS_ONE_OF",
"matchWildcard": true,
"matchCaseSensitive": false,
"values": [
"text/html*",
"text/css*",
"application/x-javascript*"
]
}
}
],
"behaviors": [
{
"name": "gzipResponse",
"options": { "behavior": "ALWAYS" }
}
]
}
]
}
}
Criteria are structured exactly the same as behavior
objects, with a name
string identifier and a nested options
object. Most criteria options behave similarly. The values
option usually specifies the set of strings you're trying to match. Throughout PAPI, whenever a value is optionally plural, it's always represented as an array. The matchWildcard
options allow you to match flexibly with *
and ?
characters, and various matchCaseSensitive
options allow you to ignore case. The matchOperator
option typically inverts the result, so that the criteria succeeds if specified values don't match.
The example above features a single contentType
criteria. Once you define more than one, the rule needs a criteriaMustSatisfy
field to set whether to match any
or all
criteria. This alternate example of the children
array adds a random
criteria to match half the requests for the specified contentType
.
"children": [
{
"name": "Compress Half of Requests for Text Content",
"criteriaMustSatisfy": "all",
"criteria": [
{
"name": "contentType",
"options": {
"matchOperator": "IS_ONE_OF",
"matchWildcard": true,
"matchCaseSensitive": false,
"values": [
"text/html*",
"text/css*",
"application/x-javascript*"
]
}
},
{
"name": "random",
"options": { "bucket": 50 }
}
],
"behaviors": [
{
"name": "gzipResponse",
"options": { "behavior": "ALWAYS" }
}
]
}
]
In this example, criteriaMustSatisfy
is set to all
. If it were set to any
, the criteria would compress all text content, and half of all other content, including images that are already compressed. This is almost certainly not what you want, and exemplifies the sort of problem that falls beyond what the API can identify for you, as discussed in the Errors section.
Note that rules don't provide any explicit support for else cases in response to criteria matches, but there are a couple of ways to implement them:
-
Specify exclusive pairs of match criteria. From the example above, the first rule could specify a
contentType
criteria that matches HTML/CSS/JavaScript using amatchOperator
ofIS_ONE_OF
. The second rule could specify the samecontentType
criteria, only with amatchOperator
ofIS_NOT_ONE_OF
. -
Override a parent rule's behavior. In the
random
example above, if you were to apply some other behavior to the remaining half of the requests, you'd need to do so as part of the parent rule. If the parent rule enables a behavior that shouldn't apply to the child, the child rule needs to specify the behavior again specifically to disable it.