Deploy AXP Edge with F5 Distributed Cloud
Route AI agent traffic to AXP Edge from an F5 Distributed Cloud (XC) HTTP Load Balancer, with automatic failover to your origin.This guide deploys AXP Edge on F5 Distributed Cloud (XC) — F5’s SaaS edge/CDN platform (formerly Volterra, identifiable by a
server: volt-adc response header). XC inspects each request’s user-agent at its edge; requests from recognized AI agents (GPTBot, ClaudeBot, Google-Extended, and similar) are routed to the Publive CDS backend as an alternate origin instead of your normal origin. Every other request (human visitors and SEO bots) reaches your origin untouched.
Use this approach when F5 Distributed Cloud is the public-facing edge terminating your traffic and there is no separate CDN (Cloudflare, Akamai, Fastly, CloudFront) in front of it. If a CDN does sit in front of XC, integrate at that CDN layer instead.
F5 XC does not have a single programmable “worker” like Cloudflare. The routing decision is expressed across three XC constructs working together: a Service Policy (matches the AI-agent user-agent and page paths), an HTTP Load Balancer route rule (sends matched requests to the Publive origin pool), and a small JavaScript v8 policy on the F5 XC Mesh data plane (injects the Publive headers and enforces the loop guard). This guide sets up all three.
Make sure
PubliveBot/1.0 (+https://axp.thepublive.com/bot) is unblocked in your XC Bot Defense / WAF / Malicious Users policies, and that LLM user agents (GPTBot, ClaudeBot, Google-Extended, and similar) are unblocked in XC, in robots.txt, and in any origin-side firewall rules. If XC’s own Bot Defense blocks an agent before the Service Policy evaluates it, that traffic never gets a chance to route to AXP Edge.Prerequisites
- An F5 Distributed Cloud tenant with the target domain already served by an HTTP Load Balancer in the XC Console.
- Permission in that tenant to create Service Policies, Origin Pools, Route rules, and (Mesh) JavaScript / service-policy rules on the Load Balancer.
- Your Publive Edge CDS API key and backend URL (issued per client — contact support@thepublive.com if you don’t have these).
- Confirmation that XC’s data-plane JavaScript (v8) is available on your tenant plan. Header injection and the loop guard rely on it. If your plan does not include JavaScript data-plane programmability, see Header injection without JavaScript below.
How routing works
XC makes one decision per request: send it to the AXP Edge origin pool, or serve it from your normal origin. A request only qualifies for AXP Edge when all of the following are true:- The request hostname matches your Load Balancer’s configured domain.
- The request hasn’t already been routed once (a loop-guard header prevents re-routing looped or failed-over requests).
- The method is
GETorHEAD, and the path isn’t a static asset (.js,.css, images, fonts, and similar are always skipped). - The user-agent matches a known AI agent (or the request carries the preview flag).
AGENT_BOTS array) rather than in a single Worker file. To add or remove a bot, edit the Service Policy rule and the JS array, then re-save the Load Balancer.
Set up the integration
1
Create the AXP Edge origin pool
In the XC Console, go to Multi-Cloud App Connect → Manage → Load Balancers → Origin Pools → Add Origin Pool.
- Name:
publive-cds-pool - Origin server: the Publive CDS backend as a DNS name origin (public name, e.g.
cds.thepublive.com). - TLS: enable TLS to the origin; use SNI set to the CDS hostname.
- Port:
443. - Health check: use a simple HTTPS health check against the CDS health path (Publive provides this with your key).
2
Create the agent-match Service Policy
Go to Web App & API Protection → Manage → Service Policies → Add Service Policy (or add a custom rule set on the Load Balancer).Add a rule named
match-ai-agents that matches when all of:- HTTP method is
GETorHEAD. - Path does not match the static-asset pattern:
\.(js|css|map|json|xml|txt|ico|png|jpe?g|gif|svg|webp|avif|woff2?|ttf|eot|otf|mp4|webm|mov|mp3|wav|pdf|zip|rar|7z|gz)$(case-insensitive). User-Agentheader matches (case-insensitive, “contains” / regexOR) any of the agent bots listed below, OR the request carries headerx-pl-preview: 1.
x-pl-agent-match: 1) or use it directly as the route-match predicate in the next step. Tagging is cleaner because the JS policy and the route rule can both read one header.Agent bots to match (keep in sync with the JS policy)
Agent bots to match (keep in sync with the JS policy)
3
Add the JavaScript data-plane policy (header injection + loop guard)
On the Load Balancer, add a JavaScript (v8) request policy (XC Mesh data-plane programmability). This is the equivalent of the Cloudflare Worker’s
buildCDSHeaders and loop-guard logic. It runs only on requests the Service Policy tagged, strips any inbound spoofed x-pl-* headers, and injects Publive’s trusted headers.publive-edge-xc.js
XC’s JavaScript data-plane API surface (object names,
getHeader/setHeader signatures, how env variables are exposed) varies by tenant version. Treat the code above as the contract to implement, not a byte-for-byte drop-in: the required behaviour is (1) skip looped requests, (2) match agent UA or preview flag, (3) strip inbound x-pl-*, (4) inject the header set above. Confirm the exact API against your tenant’s JavaScript policy documentation.4
Add the route rule to the Load Balancer
Open your HTTP Load Balancer → Routes → Add Route.
- Match: the tag from the Service Policy (
x-pl-agent-match: 1), or replicate the same UA + method + path predicate directly on the route. - Action: route to
publive-cds-pool(the origin pool from Step 1). - Path rewrite (required): rewrite the outbound request path to the fixed CDS endpoint
/axp/view/— e.g. a route “replace path” / “prefix rewrite” action that discards the original path and sends every matched request to/axp/view/. The original path + query is preserved separately in thex-pl-urlheader (Step 3), so CDS reads the target page from that header, not from the URL. Without this rewrite, XC forwards the original path and CDS receives the wrong endpoint. - Failover: set the route / pool so that on origin-pool failure (CDS 4xx/5xx, timeout, or unreachable) traffic falls back to your default origin pool. Mark failed-over responses by having XC add response header
x-pl-fo: 1(response-header rule on the failover path). - Leave the default route pointing at your existing origin pool so all non-matching (human + SEO) traffic is untouched.
5
Configure variables / secrets
Store these as Load Balancer or policy variables (use XC’s secret type for the API key, never inline it in JS):
Verify
Send test requests to a real page path (not a static asset) and inspect headers:- Bot traffic: the AI-agent request returns a response with the
x-pl-request-idheader present, confirming it was served by CDS. - Human traffic: the browser-UA request shows no CDS header, and content/response time is unchanged.
- Failover: temporarily point
publive-cds-poolat an unreachable host (or simulate a CDS outage) and confirm the response carriesx-pl-fo: 1and still serves your real origin content. - XC fingerprint sanity check: a normal response should still show
server: volt-adcand anx-volterra-locationheader, confirming you’re testing against the XC edge and not a bypassed path.
Troubleshooting
XC does not have a per-requestPL_EDGE_DEBUG log toggle like the Cloudflare Worker. Use the XC Console’s request logs (and the Load Balancer’s security event / access log views) to trace where a request stopped qualifying.
Header injection without JavaScript
If your XC tenant plan does not include JavaScript data-plane programmability, the header injection in Step 3 can be approximated with static request-header rules on the route:- Set
x-pl-host,x-pl-api-key,x-pl-url(from the built-in path variable), andx-pl-client-ip(from XC’s client-IP variable) as fixed/route-variable request headers on the agent-match route. - Enforce the loop guard by making the agent-match route not match when
x-pl-requestis already present. - The trade-off: static rules are less expressive than the JS policy (e.g. conditional
refererforwarding, dynamic loop-guard values), and header hygiene (stripping inbound spoofedx-pl-*) must be done as explicit delete-header rules ahead of the set-header rules. Confirm this path with Publive support before relying on it for a production client.
Next steps
AXP Edge dashboard
Monitor agent traffic and manage optimization rules.
Deploy on Cloudflare
On Cloudflare instead? Use the Worker-based guide.