INTEGRITY Cloudflare Docs

Origin Cache Control

Origin Cache Control is a Cloudflare feature. When enabled on an Enterprise customer's website, it indicates that Cloudflare should strictly respect Cache-Control directives received from the origin server. Free, Pro and Business customers have this feature enabled by default.

Cache-Control directives in the HTTP response from your origin server provide specific caching instructions to intermediary services like Cloudflare.

With the Origin Cache Control feature enabled, Cache-Control directives present in the origin server's response will be followed as specified. For example, if the response includes a max-age directive of 3,600 seconds, Cloudflare will cache the resource for that duration before checking the origin server again for updates.

Cloudflare's Cache Rules allows users to either augment or override an origin server's Cache-Control headers or default policies set by Cloudflare.

The following sections cover:

Cache-control directives

A Cache-Control header can include a number of directives, and the directive dictates who can cache a resource along with how long those resources can be cached before they must be updated.

If multiple directives are passed together, each directive is separated by a comma. If the directive takes an argument, it follows the directive separated by an equal sign. For example: max-age=86400.

Directives can be broken down into four groups: cacheability, expiration, revalidation, and other.

Cacheability

Cacheability refers to whether or not a resource should enter a cache, and the directives below indicate a resource's cacheability.

Expiration

Expiration refers to how long a resource should remain in the cache, and the directives below affect how long a resource stays in the cache.

Ensure the HTTP Expires header is set in your origin server to use Greenwich Mean Time (GMT) as stipulated in RFC 2616.

Revalidation

Revalidation determines how the cache should behave when a resource expires, and the directives below affect the revalidation behavior.

The stale-if-error directive is ignored if Always Online is enabled or if an explicit in-protocol directive is passed. Examples of explicit in-protocol directives include a no-store or no-cache cache directive, a must-revalidate cache-response-directive, or an applicable s-maxage or proxy-revalidate cache-response-directive.

Other

Additional directives that influence cache behavior are listed below.

Understand no-store and no-cache directives

There is often confusion between the directives Cache-Control: no-store and Cache-Control: no-cache, particularly regarding how they impact browser caching and features like the Back-Forward Cache (BFCache).

no-store

no-cache

For more information about how these directives behave when Origin Cache Control is enabled or disabled refer to the Directives section.

Enable Origin Cache Control

If you enable Origin Cache Control, Cloudflare will aim to strictly adhere to RFC 7234. Enterprise customers have the ability to select if Cloudflare will adhere to this behavior, enabling or disabling Origin Cache Control for their websites through cache rules in the dashboard or via API. Free, Pro, and Business customers have this option enabled by default and cannot disable it.

Origin Cache Control behavior

The following section covers the directives and behavioral conditions associated with enabling or disabling Origin Cache Control.

Directives

The table below lists directives and their behaviors when Origin Cache Control is disabled and when it is enabled.

Directive Origin Cache Control Disabled Behavior Origin Cache Control Enabled Behavior
s-maxage=0 Will not cache. Caches and always revalidates
max-age=0 Will not cache. Caches and always revalidates.
no-cache Will not cache. Caches and always revalidates. Does not serve stale.
no-cache=<headers> Will not cache. Caches if headers mentioned in no-cache=<headers> do not exist. Always revalidates if any header mentioned in no-cache=<headers> is present.
Private=<headers> Will not cache. Does not cache <headers> values mentioned in Private=<headers> directive.
must-revalidate Cache directive is ignored and stale is served. Does not serve stale. Must revalidate for CDN and for browser.
proxy-revalidate Cache directive is ignored and stale is served. Does not serve stale. Must revalidate for CDN but not for browser.
no-transform May (un)Gzip, Polish, email filter, etc. Does not transform body.
s-maxage=delta, delta>1 Same as max-age. Max-age and proxy-revalidate.
immutable Not proxied downstream. Proxied downstream. Browser facing, does not impact caching proxies.
no-store Will not cache. Will not cache.

Conditions

Certain scenarios also affect Origin Cache Control behavior when it is enabled or disabled.

Condition

Origin Cache Control disabled behavior

Origin Cache Control enabled behavior

Presence of Authorization header.

Content may be cached.

Content is cached only if must-revalidate, public, or s-maxage is also present.

Use of no-cache header.

In logs, cacheStatus=miss.

In logs, cacheStatus=bypass.

Origin response has Set-Cookie header and default cache level is used.

Content may be cached with stripped set-cookie header.

Content is not cached.

Browser Cache TTL is set.

Cache-Control returned to eyeball does not include private.

If origin returns private in Cache-Control then preserve it.

Examples

Review the examples below to learn which directives to use with the Cache-Control header to control specific caching behavior.

Cache a static asset.

Cache-Control: public, max-age=86400

Ensure a secret asset is never cached.

Cache-Control: no-store

Cache assets on browsers but not on proxy cache.

Cache-Control: private, max-age=3600

Cache assets in client and proxy caches, but prefer revalidation when serve.

Cache-Control: public, no-cache

Cache assets in proxy caches but REQUIRE revalidation by the proxy when serve.

Cache-Control: public, no-cache, proxy-revalidate or Cache-Control: public, s-maxage=0

Cache assets in proxy caches, but REQUIRE revalidation by any cache when serve.

Cache-Control: public, no-cache, must-revalidate

Cache assets, but ensure the proxy does not modify it.

Cache-Control: public, no-transform

This configuration also disables transformation like gzip or brotli compression from our edge to your visitors if the original payload was served uncompressed.

Cache assets with revalidation, but allow stale responses if origin server is unreachable.

Cache-Control: public, max-age=3600, stale-if-error=60

With this configuration, Cloudflare attempts to revalidate the content with the origin server after it has been in cache for 3600 seconds (one hour). If the server returns an error instead of proper revalidation responses, Cloudflare continues serving the stale resource for a total of one minute beyond the expiration of the resource.

Cache assets for different amounts of time on Cloudflare and in visitor browsers.

Cache-Control: public, max-age=7200, s-maxage=3600

Cache an asset and serve while asset is being revalidated.

Cache-Control: max-age=600, stale-while-revalidate=30

This configuration indicates the asset is fresh for 600 seconds. The asset can be served stale for up to an additional 30 seconds while Cloudflare revalidates the asset with the origin in the background. For more information, refer to Revalidation.

Interaction with other Cloudflare features

This section covers how other Cloudflare features interact with Cache-Control directives.

Edge Cache TTL

Edge Cache TTL Cache Rules override s-maxage and disable revalidation directives if present. When Origin Cache Control is enabled at Cloudflare, the original Cache-Control header passes downstream from our edge even if Edge Cache TTL overrides are present. Otherwise, when Origin Cache Control is disabled at Cloudflare, Cloudflare overrides the Origin Cache Control.

Browser Cache TTL

Browser Cache TTL Cache Rules override max-age settings passed downstream from our edge, typically to your visitor's browsers.

Polish

Polish is disabled when the no-transform directive is present.

Gzip and Other Compression

Compression is disabled when the no-transform directive is present. If the original asset fetched from the origin is compressed, it is served compressed to the visitor. If the original asset is uncompressed, compression is not applied.

JavaScript Detections

JavaScript Detections injection is disabled when the no-transform directive is present. The cf.bot_management.js_detection.passed field will show as missing for affected requests.