Skip to main content

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 GET or HEAD, 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).
If the request qualifies, XC routes it to the Publive CDS origin pool with the Publive headers injected, and returns the response. If CDS errors or is unreachable, XC’s origin-pool failover returns your real origin content instead, tagged with a failover header. Visitors never see an error. Unlike the Cloudflare integration, the agent bot list here lives in the Service Policy match expression (and the JS policy’s 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).
This pool is the AXP Edge destination. Your existing origin pool (your real site) stays exactly as it is and remains the default.
CDS is a single fixed endpoint: https://cds.thepublive.com/axp/view/. The original request path is not appended to the CDS URL — it travels in the x-pl-url header instead (set by the JS policy in Step 3). By default, an XC origin pool preserves the incoming request path, which would incorrectly send /pricing?x=1 to cds.thepublive.com/pricing?x=1. You must rewrite the outbound path to the fixed /axp/view/ endpoint on the route (Step 4). The origin pool server here is just the host (cds.thepublive.com); the fixed /axp/view/ path is applied by the route rewrite.
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 GET or HEAD.
  • 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-Agent header matches (case-insensitive, “contains” / regex OR) any of the agent bots listed below, OR the request carries header x-pl-preview: 1.
Set the rule action to a value your route rule can key on — either tag it (add request header 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.
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 the x-pl-url header (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.
Order matters: the agent-match route must be evaluated before the catch-all default route.
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-id header 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-pool at an unreachable host (or simulate a CDS outage) and confirm the response carries x-pl-fo: 1 and still serves your real origin content.
  • XC fingerprint sanity check: a normal response should still show server: volt-adc and an x-volterra-location header, confirming you’re testing against the XC edge and not a bypassed path.

Troubleshooting

XC does not have a per-request PL_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), and x-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-request is already present.
  • The trade-off: static rules are less expressive than the JS policy (e.g. conditional referer forwarding, dynamic loop-guard values), and header hygiene (stripping inbound spoofed x-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.
Last modified on August 10, 2026