72 lines
2.4 KiB
Markdown
72 lines
2.4 KiB
Markdown
---
|
|
project: cloudflare-cache-woocommerce
|
|
type: tech-setup
|
|
status: completed
|
|
tags:
|
|
- pbs
|
|
- cloudflare
|
|
- woocommerce
|
|
- cache
|
|
- production
|
|
created: 2026-03-24
|
|
updated: 2026-03-24
|
|
path: PBS/Tech/
|
|
---
|
|
|
|
# Cloudflare Cache Rules - WooCommerce Setup
|
|
|
|
## Background
|
|
|
|
After launching the WooCommerce store, a "coming soon" page was sticking around for visitors due to Cloudflare serving a cached version. The root cause was an aggressive "cache all" rule with no WooCommerce exceptions.
|
|
|
|
## What Was Already in Place
|
|
|
|
A cache rule set to **All incoming requests → Eligible for cache** was in place to improve cache hit rate (previously 87% of traffic was uncached).
|
|
|
|
## Problem
|
|
|
|
With a whole-site cache rule and no exceptions, Cloudflare was caching WooCommerce dynamic pages including:
|
|
- Cart
|
|
- Checkout
|
|
- My Account
|
|
- Pages tied to active shopping sessions
|
|
|
|
This caused stale content to be served to visitors, including the "coming soon" page after the store launched.
|
|
|
|
## Solution
|
|
|
|
Created a **new cache rule placed above the existing "cache all" rule** with the following configuration:
|
|
|
|
### Rule: WooCommerce Bypass
|
|
**Order:** First (runs before the cache all rule)
|
|
**Filter:** Custom expression
|
|
|
|
```
|
|
(http.request.uri.path contains "/cart") or
|
|
(http.request.uri.path contains "/checkout") or
|
|
(http.request.uri.path contains "/my-account") or
|
|
(http.cookie contains "woocommerce")
|
|
```
|
|
|
|
**Cache eligibility:** Bypass cache
|
|
**TTL settings:** None needed (bypass ignores TTL)
|
|
|
|
## How It Works
|
|
|
|
Cloudflare cache rules use **first match wins** logic:
|
|
- Rule 1 catches all WooCommerce pages and active shopping sessions → bypass cache
|
|
- Rule 2 catches everything else → cache it
|
|
|
|
This means static content (recipes, homepage, product images) still gets cached for performance, while dynamic shopping pages always serve fresh content.
|
|
|
|
## Key Decisions
|
|
|
|
- Used `http.cookie contains "woocommerce"` instead of listing individual cookie names — broader match covers all current and future WooCommerce cookies
|
|
- No browser TTL needed on the bypass rule — nothing is being stored
|
|
- Left the existing "cache all" rule unchanged — exceptions-first approach is cleaner than listing every page to cache
|
|
|
|
## Result
|
|
|
|
- WooCommerce cart, checkout, and account pages now always serve fresh content
|
|
- Rest of the site continues to benefit from Cloudflare caching
|
|
- No stale page issues for customers during active shopping sessions |