ZIA • Policy Enforcement • Order of Execution • Field Notes
Every security feature you enable participates in a defined enforcement model. For web traffic, a blocking violation stops the policies that follow, and the applicable sequence changes depending on whether ZIA is evaluating a GET request, a POST request, or the response.
Why this one exists
There is a sentence that turns up early in most ZIA projects, usually said with relief:
“We’re buying a cloud proxy. We don’t have to manage the infrastructure anymore.”
The first half is true, and it is a substantial win. The racks, cooling, capacity planning, patching and hardware refresh genuinely stop being your problem.
The second half is where the trouble starts, because not managing the infrastructure is not the same thing as not managing the service.
The platform offers URL filtering, cloud app control, tenant restrictions, firewall, DNS control, IPS, SSL inspection, DLP, sandbox, file type controls, antivirus and advanced threat protection. It is understandable for an organization to enable as much as its licence permits. But these controls do not operate as unrelated appliances, and enabling more functions does not remove the need to understand how their decisions interact.
First, the vocabulary
The rest of this article talks about GET requests, POST requests, CONNECT, SNI and responses as though everybody works with them daily. Plenty of people who have to understand ZIA policy do not, and the enforcement order makes very little sense without them.
So this section is a short primer on what actually happens when a browser opens an HTTPS page. None of it is Zscaler-specific — it is how the protocols work, and it would be equally true with any proxy, or with none at all. If it is already familiar, skip to the next section.
One request, eight stages
A user types an address and presses enter. To the user that is one action. To the network it is a sequence, and each step exposes something different to anything sitting in the path.
Resolving the name. Before anything can be sent, the hostname has to become an address. At this point the only information in play is the name being looked up and the answer that comes back.
Opening the transport. A TCP connection, or a QUIC session over UDP. What is visible is an address and a port — enough to know that something is talking to something, and nothing about what.
Reaching the destination. This step differs depending on how traffic is being forwarded, which is the subject of the next figure. In one arrangement the browser issues a CONNECT naming the destination. In the other it simply opens a connection, and the domain has to be learned elsewhere.
Beginning TLS. The client sends a ClientHello, and inside it the Server Name Indication — the SNI — which states which hostname the client wants. The SNI travels in the clear. This single fact is why a security platform can make domain-level decisions on encrypted traffic without decrypting anything, and a great deal of policy depends on it.
The server responds with its certificate. Historically this was another way to learn the destination name when no SNI was present. It is becoming less useful: under TLS 1.2 the certificate is sent in the clear, but under TLS 1.3 it is encrypted as part of the handshake. Treating it as a dependable fallback is increasingly optimistic.
The handshake completes, keys are agreed, and from here everything is encrypted.
The request, and then the response. This is where the method, the full URL, the headers and the body finally exist — and where an uploaded file or a downloaded document lives. On the wire they are indistinguishable from noise unless something is decrypting.
Almost everything a content policy wants to read exists only in the last two stages, and only after decryption.
One caveat, since this article is careful about such things elsewhere: where Encrypted Client Hello is deployed, the SNI assumption in stage four no longer holds. It is not yet widespread, and it is worth watching.
Two ways traffic arrives, and two first questions
The third stage above is where a real difference appears, and it changes what the first usable piece of information is.
With an explicit proxy, the browser has been told there is a proxy and addresses it deliberately. For an HTTPS destination it issues a CONNECT request naming the host and port — CONNECT portal.example.com:443 — and asks the proxy to open a tunnel. The destination domain is therefore stated in the clear, in an ordinary HTTP request, before any TLS begins.
With transparent forwarding — a GRE or IPsec tunnel from a location, or a tunnel established by an endpoint client — the browser has no proxy configured. As far as it is concerned it is connecting straight to the destination. The steering happens underneath, and no CONNECT request is ever generated. What arrives is the TLS ClientHello, and the domain has to be read from the SNI.
Worth being precise about: with tunnel-based client forwarding, the browser does not address the Public Service Edge as its HTTP proxy at all. The traffic is steered rather than proxied by configuration, which is why the first observable is a ClientHello rather than a CONNECT.
Both paths end up able to make a domain-level decision. They simply learn the domain from a different place, at a slightly different moment, and that is enough to matter when you are reconstructing why something was allowed or blocked.
There is no such thing as an HTTP packet
This one clears up a confusion that turns up constantly in troubleshooting conversations, usually in the form of somebody asking to see “the HTTP packet”.
An HTTP message is a logical thing: a method, a URL, headers and possibly a body. It is what a policy wants to read, and it has no fixed size.
That message is carried inside TLS records, which encrypt it. One message can span several records, and one record can carry parts of more than one message.
Those records are carried inside TCP segments, or divided differently again by QUIC over UDP. And those in turn travel as IP packets, which is what is actually on the wire.
The important part is that none of these boundaries line up. A single HTTP request can be spread across many packets, and a single packet can contain the tail of one thing and the beginning of another.
Which is why an inline system reassembles rather than judges packet by packet, and why some decisions cannot be taken on the first thing that arrives.
GET, POST and the response are three different subjects
Finally, the distinction that matters most for everything that follows, because the enforcement order treats these three as genuinely different things.
A GET request asks for something. It carries a destination, a method, a URL and headers. What it does not carry is a body being uploaded, and nothing has been returned yet. There is no file to scan, because no file has arrived.
A POST request sends something. It carries everything a GET carries, plus an outbound body: form data, a submitted document, an uploaded file. This is the moment where content leaving the organization exists.
A response is what comes back: a status, headers, and an inbound body — a page, a document, a downloaded file. This is the moment where content arriving at the organization exists.
Hold on to that, because the next few sections are built on it. When the platform applies a different set of policies to each of the three, it is not being arbitrary. It is applying the policies that have something to read.
Part one
The model
1. Nine products, or one decision
Ask an engineer who grew up with appliances what a security stack looks like, and the answer is a list of boxes: a VPN concentrator, firewall, proxy, DNS server, IPS, antivirus gateway, DLP appliance and sandbox.
One function, one box, one configuration and one console. Each could be tuned without necessarily considering the internal decision model of the others.

Zscaler’s Single Scan Multi-Action architecture works differently. Packets are placed in shared memory available to the CPUs on a Public Service Edge, with dedicated processing resources for different functions. The inspection engines can inspect the same packets in a single pass rather than sending traffic through a chain of independent appliances.
After the SSMA inspection process is complete, the Public Service Edge executes policies with specific precedence.
The inspection engines can operate on the same traffic within SSMA. Policy enforcement then follows the documented precedence. That distinction governs the rest of this article.
Field note: turning everything on at once is not a security posture. Introduce controls in a sequence that lets the team identify which policy produced each outcome.
2. “Why is there no NOT?”
Here is an objection I have heard more than once, usually from somebody competent, usually about two weeks in.
“Why can’t I write all groups except that one? I have to build two rules to express something that should be one condition.”
Many ZIA policy criteria are expressed through combinations of AND between criterion families and OR within selected families. The exact selectors vary by policy. A policy may, for example, treat users, groups or departments as alternatives within one family while combining that result with locations, time and other criteria.
Where a policy does not expose an exclusion selector, the usual supported design is structural: place a narrow exception rule above the broader rule and let rule order determine which one matches first. Some policy types provide dedicated exception constructs, exclude options or alternative evaluation modes, so this should not be treated as a universal statement that every ZIA policy behaves identically.
What you are actually paying for
A service running globally and evaluating policy at scale has to favour constructs that remain predictable, supportable and understandable under operational pressure.
A missing option may be a product limitation, a deliberate design choice, or a construct expressed elsewhere in the policy model. The practical question is whether the supported alternative remains clear, testable and maintainable.
You are buying scale, speed and resilience. The trade-off is that not every appliance-era customization has a direct one-rule equivalent.
And the honest question underneath
It is worth asking of each customisation: how much of this is a real requirement, and how much is a technical flourish?
Some exclusions exist because a regulator demands them. Others exist because somebody could build them elegantly, and nobody asked whether two supported rules would have been sufficient.
At the next software release or service change, what happens to my beautifully engineered custom configuration?
The truthful answer is that it needs to be validated. That is comfortable in a lab and less comfortable in production, where undocumented behaviour is difficult to support when the original designer is no longer available.
Two rules in a supported construct that anybody can read are not necessarily a compromise. Quite often they are the more maintainable design.
3. Two modules, three paths
Each Public Service Edge has two main modules that apply policy: a web module and a Firewall module. Which module sees a transaction depends on the traffic type, direction and whether the relevant Firewall policy is enabled for the location.

Outbound web traffic is evaluated by the Firewall module when the documented enforcement conditions are met. If it violates a Firewall policy, it is blocked there. If it passes, it proceeds to the web module.
Outbound non-web traffic going to ports other than 80 and 443, or other configured HTTP and HTTPS ports, is evaluated only by the Firewall module when Firewall policy is enabled for the location.
Inbound web traffic, meaning a response to an HTTP GET or POST request, is sent to the web module. It is not sent back through the Firewall module for another policy evaluation.
Why two log views can disagree about one transaction
When web traffic violates a Firewall policy, both Firewall Insights and Web Insights indicate that it was blocked. If it passes the Firewall policy and is later blocked by a web policy, Firewall Insights can show it as allowed while Web Insights shows it as blocked.
Both views describe the outcome observed by their respective modules.
And the firewall does not have the final word
Zscaler’s example allows Box.net in Firewall policy and blocks the same application in Web policy. The user is blocked because a Firewall allow permits evaluation to continue; it does not exempt the transaction from the web module.
4. Three transactions, three orders
There is not one web-policy sequence. Zscaler documents three separate enforcement orders, with different policies and lengths, depending on whether the web module evaluates an HTTP GET request, HTTP POST request, or the response.

GET request: Custom Malicious URLs, Cloud App Control, URL Filtering, Security Exceptions, Browser Control, Country-Based Blocking, IPS Signature Detection, Suspicious Content Protection, P2P Control and Bandwidth Control.
At this stage ZIA evaluates the outbound request to retrieve a resource. Controls that operate on uploaded or returned files appear in the POST or response sequences instead.
POST request: Custom Malicious URLs, Cloud App Control, URL Filtering, Security Exceptions, Browser Control, Country-Based Blocking, Malicious URL Block, IPS Signature Detection, Suspicious Content Protection, Malware Protection, File Type Control, Data Loss Prevention, P2P Control and Bandwidth Control.
Response: Security Exceptions, IPS Signature Detection, Suspicious Content Protection, Sandbox for known malicious files, Malware Protection, File Type Control, Sandbox for unknown files, AI/ML-based Content Categorization and Bandwidth Control.
A blocking violation stops the policies that follow
When the web module determines that a transaction violates a specific policy, the Public Service Edge immediately blocks that transaction and does not continue enforcing the policies that follow.
Zscaler’s documentation provides a worked example in which File Type Control blocks an outbound PDF before DLP can evaluate the sensitive data inside it. File Type Control appears at position eleven in the POST sequence, before DLP at position twelve.
The file is blocked, but DLP is not triggered and its configured auditor notification is not generated. The immediate security objective is met, while the expected DLP event and compliance notification are not produced.
Field note: a security outcome and a compliance outcome are not the same thing. Enforcement order can deliver one without the other.
What Security Exceptions actually does
Security Exceptions is an allowlist configured in the Security Exceptions tab of Malware Protection or Advanced Threat Protection. For a matching URL, the Public Service Edge skips the relevant Malware Protection, Advanced Threat Protection and Sandbox checks identified by the documentation.
It is a targeted exemption from threat controls, not a universal allowlist that overrides every access policy.
Part two
What the order can actually see
5. When only the domain exists
The sequence is defined, but the information available to its controls depends on the stage of the connection. The sharpest example is encrypted traffic before decryption.

During a CONNECT request or an incoming SSL/TLS connection evaluated through Client Hello SNI, ZIA has the destination domain, not the full URL or HTTP headers.
The documented subset is Known Malicious URLs, Cloud App Control, URL Filtering and Bandwidth Control.
Where evaluation starts depends on traffic forwarding
In explicit proxy mode, URL Filtering and Cloud App Control are evaluated against the first CONNECT request, and the SSL/TLS Inspection policy is evaluated against that CONNECT request.
In transparent proxy mode, the first policy evaluation occurs on the incoming SSL/TLS connection using the SNI.
Without user context, evaluation is skipped rather than guessed
Surrogate IP or Zscaler Client Connector is required for the Public Service Edge to have user context during CONNECT or Client Hello SNI evaluation. If user context is missing and authentication is enabled for the location, the service skips that policy evaluation to avoid an incorrect decision. If policy for unauthenticated traffic is enabled, it evaluates that policy instead.
6. SSL inspection: the switch that moves everything else
SSL/TLS Inspection determines whether ZIA can expose the HTTP request, headers and payload needed by downstream content controls. It therefore has a wider policy effect than the act of decryption alone.

Inspect. ZIA decrypts the traffic, evaluates the applicable request or response policy sequence against the information now available, and re-encrypts traffic allowed to continue. Which controls run still depends on transaction type, enabled policies, configuration and content.
Do Not Inspect and Evaluate Other Policies. The traffic remains encrypted. ZIA continues evaluating controls that can operate on visible information. During CONNECT or SNI evaluation, the enforcement documentation identifies the four domain-based checks described above.
Do Not Inspect and Bypass Other Policies. The service bypasses the other web policies for matching traffic. This broad exception should have the narrowest practical scope, a documented owner and a review date.
The absence of a URL Filtering block does not by itself prove that URL Filtering evaluated a transaction. A higher-order SSL/TLS bypass may have prevented downstream evaluation.
Two behaviours around the block page
If SSL/TLS Inspection is disabled but Show EUN for Blocked Traffic is enabled, the Public Service Edge performs inspection on the first HTTPS transaction so it can return an end-user notification.
When the destination domain is known to contain an advanced threat, the connection terminates without an EUN. A block on the CONNECT host header returns HTTP 403; a block on SNI resets the connection.
Part three
The two policies that argue with each other
7. Cloud App Control and URL Filtering
These policies appear next to each other in the documented GET and POST sequences, at positions two and three.
By default, if a Cloud App Control rule explicitly allows the requested cloud-app action, the service applies that result and skips URL Filtering, then proceeds to Browser Control. This is a specific documented interaction, not a general statement that any allow in an earlier policy always prevents later policies from running.
In Zscaler’s example, Cloud App Control allows viewing Facebook while URL Filtering blocks http://www.facebook.com. Without cascading, the user is allowed. With Allow Cascading to URL Filtering, URL Filtering is evaluated after the Cloud App Control allow and the user is blocked.

In the documented interaction, cascading adds URL Filtering after a Cloud App Control allow. It does not override a transaction that Cloud App Control has already blocked.
If there is no applicable Cloud App Control rule for the cloud app, URL Filtering evaluates normally.
Configuration details need their own source
The exact placement and scope of cascading controls in the administration interface are configuration details and may vary with service updates, rule type and predefined application rules.
Before relying on a global option, per-rule field or predefined Microsoft 365 rule, verify the current Cloud App Control and Advanced Settings documentation for the tenant in which the change will be made.
Cascading is not enabled by default in the behaviour described by the policy-enforcement documentation.
8. Specific match before rule order
Rule order is a dominant pattern across ZIA policy configuration, and the web enforcement chain stops after a policy blocks a transaction. URL category specificity introduces a separate decision before the relevant URL Filtering rule is selected.
When enforcing URL Filtering policy rules containing a wildcard, the Public Service Edge always looks for a specific match first.

Custom Category 1 contains .example.com. Custom Category 2 contains abc.example.com. A URL Filtering rule blocks everything in Custom Category 1 for a given location.
A request to abc.example.com is not blocked by that rule, because the exact domain matches Custom Category 2, which is not blocked in the example.
A more specific category can therefore create an exception to the coverage expected from a wildcard category. The policy list may appear correctly ordered because the category candidate was resolved before rule order became decisive.
If you have read the ZPA articles in this series, the shape may feel familiar. This is an analogy, not a claim that ZIA and ZPA use the same enforcement implementation.
Part four
And then it goes live
9. The logs are where the order becomes useful
Policies are the part of the platform users feel. A blocked site, held download or certificate warning becomes a ticket, and the service desk or SecOps team has to explain it.
The policy reason explains the recorded outcome
Web Insights and NSS reporting expose policy-reason values that identify or explain many policy outcomes. Read that field alongside the action, policy type, request method and relevant log view.
- A URL Filtering denylist block points to the request-side URL Filtering stage.
- A reputation block can point to Advanced Threat Protection.
- A download blocked by an antivirus signature belongs to the response path.
- A Sandbox first-time action may hold or quarantine a file rather than issue a permanent block.
- A DLP rule can be violated while the transaction is allowed and an email is sent to the auditor.
- An override password can produce an initial block followed by an allowed transaction.
Read the action and policy reason first. Identify the module and traffic direction, then locate the policy in the applicable GET, POST or response sequence.
Remember the module asymmetry: a transaction blocked by a web policy can appear allowed in Firewall Insights because it passed that module before the web module blocked it.
Triage

Treat symptoms as starting hypotheses rather than proof. For certificate warnings, check trust, server-certificate validation and the inspection chain. If a browser succeeds while a developer tool fails, verify whether the tool uses a separate trust store or different proxy support. For command-line failures, check TLS compatibility, proxy handling and protocol negotiation. If an application terminates an inspected session without a useful error, certificate pinning is one possibility alongside mutual TLS and application-specific certificate validation.
Some incidents are configuration defects; others are consequences of the selected enforcement path or of how the application handles an intercepted TLS session. The action, policy reason, module and traffic direction distinguish them.
10. Management does not come free
ZIA is not a product you understand once at project level and then simply hand over. It requires operational ownership after go-live.

The platform. Rules drift and exceptions accumulate. Policy needs scheduled review, owners and expiry or review dates for exceptions.
Role separation. The service desk may need to read logs without editing URL categories. Administrative access should be scoped deliberately.
Support capability. Blocked sites, held files and certificate failures need an owned first-line process that can identify the relevant module and policy sequence.
Training. The service desk needs policy and logging basics; administrators need the sequence and interaction model; somebody must own the platform as a whole.
Every product has a learning curve. This one moved where the effort goes.
The operational benefit is substantial: no appliance capacity planning, hardware refresh or local patching cycle. But the effort does not disappear. It moves from keeping infrastructure alive to understanding and governing the service.
And the help is there, if you go and get it
Documentation, courses, certifications, reference architectures, deployment guides and troubleshooting runbooks exist. The organization still has to invest the time to use them.
The attackers study, test and specialise. The defensive team needs an equally deliberate learning path.
Final thoughts
The appliance-era mental model treated each security function as an independent box. ZIA consolidates inspection and policy enforcement, but the interactions created by that consolidation have to be learned rather than assumed.
Two modules, with outbound web traffic able to touch both. Three documented web sequences, one for GET, one for POST and one for the response. A blocking violation stops the web policies that follow. SSL/TLS Inspection determines how much information downstream controls can evaluate.
Those principles explain many of the surprises teams encounter during deployment and troubleshooting.
The rest is operations: ownership, review, support and training decide whether the design remains controlled eighteen months after go-live.
Sources and references
- Zscaler Help — Understanding Policy Enforcement
- Zscaler Help — About URL Filtering
- Zscaler Help — About Cloud App Control
- Zscaler Help — Configuring Advanced Settings
- Zscaler Help — About SSL/TLS Inspection Policy
- Zscaler Help — Configuring SSL/TLS Inspection Policy
- Zscaler Help — Adding Rules to the Cloud App Control Policy
- Zscaler Help — Configuring DLP Policy Rules with Evaluate All Rules Mode Enabled
- Zscaler Help — Policy Reasons
- Zscaler Help — Troubleshooting Runbooks
- Zero Trust Navigator — The Padlock Is Not a Promise: TLS Inspection
- Figures 1 to 13: original Zero Trust Navigator diagrams.
The enforcement sequences, module flows, worked examples and core interactions described here follow Zscaler’s published policy-enforcement documentation. Operational observations and design recommendations are identified as field notes or author analysis. Configuration options and product behaviour can change, and some features support alternative evaluation modes, so verify the current documentation and tenant configuration before relying on any sequence or setting in a production design.