Two reordered stacks contain the same CSS and assets regexes; the first matching row is highlighted in each stack for the unchanged assets CSS path.

nginx chooses the first matching regex, not a specificity score

nginx does not assign a general specificity score to every location expression. Ordinary prefixes are selected by matching length, exact locations can finish the search, and competing regex locations are evaluated in declaration order. A regex that looks narrower to a human can lose to a broader expression placed earlier. Mixing these selection rules is a common reason apparently careful routing changes affect unexpected paths. ...

December 27, 2027 · 6 min · XB Field Notes
A parent page contains a child response. A permission arrow points from the child’s frame-ancestors policy to the allowed parent origin.

Frame policy names who may embed your page

Clickjacking deceives a user about which interface receives an action. A hostile parent can place a framed application behind a misleading visual layer so that a click reaches a real control in that application. The parent need not read the child’s DOM for the user to interact with it. Same-origin read restrictions therefore do not replace a decision about whether the application may be embedded at all. ...

September 23, 2027 · 5 min · XB Field Notes
A user-controlled URL enters a server-side reach boundary and passes through a fetcher toward an internal target, illustrating delegated network position rather than a demonstrated contact.

SSRF makes the server open the door

Server-side request forgery makes a server issue a request selected or influenced by an attacker. A thumbnail service, importer, webhook tester, or document renderer may reach destinations that the requesting user cannot reach directly. The server contributes its network position and whatever credentials that particular fetch path actually attaches. A URL fetch does not automatically inherit every account credential available to the process. ...

September 5, 2027 · 5 min · XB Field Notes
A browser may automatically attach a session cookie. The article’s server gate requires POST, a session-bound anti-CSRF token, and a trusted origin signal together.

CSRF asks the browser where the request came from

Browsers can attach session cookies to attacker-triggered requests. CSRF defenses distinguish authorized request contexts; they do not prove that a person saw or intended an action. This shows the article’s server fixture, not a browser test. SameSite reduces cookie delivery; trusted request context does not prove human intent. XSS and authentication require separate defenses. Cookies travel without asking Browsers attach cookies to a request according to domain, path, Secure, SameSite, and other browser rules, not on whether the page causing the request was the user’s earlier intent. That means a page on an attacker’s origin can make the victim’s browser send a state-changing request — a transfer, a password change — that carries the authenticated session cookie, and the server sees a request that looks like it came from the legitimate user. This is why a request’s mere presence of credentials is not evidence of the user’s intent; the browser is following the cookie rules, not the user’s choice. ...

September 4, 2027 · 5 min · XB Field Notes
The reported JSON body compresses from 28015 to 246 gzip bytes and decodes back to the exact original 28015 bytes. Shape sizes are schematic.

Enable gzip explicitly, then verify negotiation and decoded bytes

gzip is a response content coding: nginx can send a compressed representation that an accepting client decodes. Enabling it requires gzip on; gzip_types extends the eligible MIME types but does not activate compression by itself. The result depends on the response, request capabilities, and effective configuration. A smaller body is useful only if it still decodes to the intended content. ...

August 29, 2027 · 5 min · XB Field Notes
Requests to /a and /b converge on the same identity zone and client key. In the historical fixture, the first succeeds with 200 and the next is rejected with 429. Location names do not create separate budgets.

A request limit protects the budget named by its key

A request-rate limit applies to the identity expressed by its key, not automatically to a person, account, or endpoint. limit_req_zone stores shared state for those key values, and limit_req applies the zone while handling a request. Two locations using the same zone and key can consume the same budget. Choosing a variable therefore defines a real fairness and enforcement boundary. ...

August 28, 2027 · 6 min · XB Field Notes
An untrusted client claim reaches a replacement boundary; a crossed claim path gives way to the observed peer used at a direct-client edge.

A reverse proxy needs an explicit header trust boundary

A reverse proxy accepts a client connection and makes a separate request to an upstream application. The application’s socket peer is therefore the proxy, while information about an earlier client can arrive through request headers. Those headers are useful only when the deployment defines who may set them and how they are validated. Proxying a request does not automatically make every forwarded identity or scheme claim trustworthy. ...

August 27, 2027 · 6 min · XB Field Notes
The original request /a//b/../c?x=1 points down to current /a/c, with a separate original-retention path preserving the incoming spelling.

nginx matches normalized paths and can select a location again

nginx location matching uses a normalized URI path rather than the untouched request-target text. Percent-encoded characters are decoded, relative path components are resolved, and adjacent slashes can be merged according to configuration. Later processing can change the current URI again and trigger another location search. Understanding both transformations is necessary when a request appears to enter a different handler than its original spelling suggests. ...

August 26, 2027 · 5 min · XB Field Notes