diff --git a/src/content/docs/cache/advanced-configuration/cache-reserve.mdx b/src/content/docs/cache/advanced-configuration/cache-reserve.mdx deleted file mode 100644 index 48196217fb0d978..000000000000000 --- a/src/content/docs/cache/advanced-configuration/cache-reserve.mdx +++ /dev/null @@ -1,243 +0,0 @@ ---- -title: Cache Reserve -pcx_content_type: concept ---- - -import { Render, TabItem, Tabs } from "~/components"; - -Cache Reserve is a large, persistent data store [implemented on top of R2](/r2/). By pushing a single button in the dashboard, your website’s cacheable content will be written to Cache Reserve. In the same way that [Tiered Cache](/cache/how-to/tiered-cache/) builds a hierarchy of caches between your visitors and your origin, Cache Reserve serves as the ultimate [upper-tier cache](/cache/how-to/tiered-cache/) that will reserve storage space for your assets for as long as you want. This ensures that your content is served from cache longer, shielding your origin from unneeded egress fees. - -![Content served from origin and getting cached in Cache Reserve, and Edge Cache Data Centers (T1=upper-tier, T2=lower-tier) on its way back to the client](~/assets/images/cache/content-being-served.png) - -How long content in Cache Reserve will be considered “fresh” is determined by Edge Cache TTL setting or Cache-Control headers at your origin, if [Edge Cache TTL](/cache/how-to/edge-browser-cache-ttl/#edge-cache-ttl) is not set. After freshness expires, Cloudflare will attempt to revalidate the asset when a subsequent request arrives in Cache Reserve for the asset. This is the same behavior as in Cloudflare's regular CDN. - -The retention period of an asset is how long we will keep the asset in Cache Reserve before marking it for eviction. If an asset is not requested within the retention period, it will be evicted from Cache Reserve. Accessing the asset will extend the retention period by one period. By default, the Cache Reserve retention period is 30 days. - -Assets must [meet certain criteria](#cache-reserve-asset-eligibility) to use Cache Reserve. - -Cache Reserve is a usage-based product and [pricing](#pricing) is detailed below. While Cache Reserve does require a paid plan, users can continue to use Cloudflare’s CDN (without Cache Reserve) for free. - -## Enable Cache Reserve - -A paid Cache Reserve Plan is required for the enablement. - - - -1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/login) and select a domain. -2. Go to **Caching** > **Cache Reserve**. -3. Select **Enable storage sync**. - - - -Refer to the [Change Cache Reserve setting API](/api/resources/cache/subresources/cache_reserve/methods/edit/) for more information. - - - -:::note[Note] -You can pause Cache Reserve at any time. Pausing Cache Reserve means that Cloudflare’s network will no longer use Cache Reserve to serve data, but resources will remain in storage until they are purged or expired. -::: - -If you are an Enterprise customer and are interested in Cache Reserve, contact your account team to get help with your configuration. - -## Cache Reserve asset eligibility - -Not all assets are eligible for Cache Reserve. To be admitted into Cache Reserve, assets must: - -- Be cacheable, according to Cloudflare's standard [cacheability factors](/cache), -- Have a freshness time-to-live (TTL) of at least 10 hours (set by any means such as Cache-Control / [CDN-Cache-Control](/cache/concepts/cache-control/) origin response headers, [Edge Cache TTL](/cache/how-to/edge-browser-cache-ttl/#edge-cache-ttl), [Cache TTL By Status](/cache/how-to/configure-cache-status-code/), or [Cache Rules](/cache/how-to/cache-rules/)), -- Have a Content-Length response header. -- When using [Image transformations](/images/manage-images/create-variants/), original files are eligible for Cache Reserve, but resized file variants are not eligible because transformations happen after Cache Reserve in the response flow. - -## Limits - -- Cache Reserve file limits are the same as [R2 limits](/r2/platform/limits/). Note that [CDN cache limits](/cache/concepts/default-cache-behavior/#customization-options-and-limits) still apply. Assets larger than standard limits will not be stored in the standard CDN cache, so these assets will incur Cache Reserve operations costs far more frequently. -- Origin Range requests are not supported at this time from Cache Reserve. -- Vary for Images is currently not compatible with Cache Reserve. -- Requests to [R2 public buckets linked to a zone's domain](/r2/buckets/public-buckets/) will not use Cache Reserve. Enabling Cache Reserve for the connected zone will use Cache Reserve only for requests not destined for the R2 bucket. -- Cache Reserve makes requests for uncompressed content directly from the origin. Unlike the standard Cloudflare CDN, Cache Reserve does not include the `Accept-Encoding: gzip` header when sending requests to the origin. -- Cache Reserve is bypassed when using the Cloudflare [O2O](/cloudflare-for-platforms/cloudflare-for-saas/saas-customers/how-it-works/) setup. - -## Usage - -Like the standard CDN, Cache Reserve also uses the `cf-cache-status` header to indicate cache statuses like `MISS`, `HIT`, and `REVALIDATED`. Cache Reserve cache misses and hits are factored into the dashboard's cache hit ratio. - -Individual sampled requests that filled or were served by Cache Reserve are viewable via the [CacheReserveUsed](/logs/reference/log-fields/zone/http_requests/) Logpush field. - -Cache Reserve monthly operations and storage usage are viewable in the dashboard. - -## Pricing - -Cache Reserve charges based on the total volume of data stored, along with two classes of operations on that data: - -- [Class A operations](/r2/pricing/#class-a-operations) which are more expensive and tend to mutate state. -- [Class B operations](/r2/pricing/#class-b-operations) which tend to read existing state. - -In most cases, a Cache Reserve miss will result in both one class A and one class B operation, and a Cache Reserve hit will result in one class B operation. Assets larger than 1 GB will incur more operations proportional to their size. - -### Cache Reserve pricing - - - - - - - - - - - - - - - - - - -
Rates
Storage$0.015 / GB-month
Class A Operations (writes)$4.50 / million requests
Class B Operations (reads)$0.36 / million requests
- - - -### Storage usage - -Storage is billed using gigabyte-month (GB-month) as the billing metric. A GB-month is calculated by recording total bytes stored for the duration of the month. - -For example: - -- Storing 1 GB for 30 days will be charged as 1 GB-month. -- Storing 2 GB for 15 days will be charged as 1 GB-month. - -### Operations - -Operations are performed by Cache Reserve on behalf of the user to write data from the origin to Cache Reserve and to pass that data downstream to other parts of Cloudflare’s network. These operations are managed internally by Cloudflare. - -#### Class A operations (writes) - -Class A operations are performed based on cache misses from Cloudflare’s CDN. When a request cannot be served from cache, it will be fetched from the origin and written to cache reserve as well as our edge caches on the way back to the visitor. - -#### Class B operations (reads) - -Class B operations are performed when data needs to be fetched from Cache Reserve to respond to a miss in the edge cache. - -#### Purge - -Asset purges are free operations. - -Cache Reserve will be instantly purged along with edge cache when you send a purge by URL request. - -Other purge methods, such as purge by tag, host, prefix, or purge everything will force an attempt to [revalidate](/cache/concepts/cache-responses/#revalidated) on the subsequent request for the Cache Reserve asset. Note that assets purged this way will still incur storage costs until their retention TTL expires. - -:::note -Note this differs from the standard CDN's purge by tag, host, or prefix features which force a cache miss, requiring the origin to deliver the asset in full. -::: - -## Cache Reserve billing examples - -#### Example 1 - -Assuming 1,000 assets (each 1 GB) are written to Cache Reserve at the start of the month and each asset is read 1,000 times, the estimated cost for the month would be: - -| | Usage | Billable Quantity | Price | -| ------------------ | ----------------------------------------- | ----------------- | ---------- | -| Class B Operations | (1,000 assets) \* (1,000 reads per asset) | 1,000,000 | $0.36 | -| Class A Operations | (1,000 assets) \* (1 write per asset) | 1,000 | $4.50 | -| Storage | (1,000 assets) \* (1GB per asset) | 1,000 GB-months | $15.00 | -| **TOTAL** | | | **$19.86** | -| | | | | - - - -#### Example 2 - -Assuming 1,000,000 assets (each 1 MB) are in Cache Reserve, and: - -- each asset expires and is rewritten into Cache Reserve 1 time per day -- each asset is read 2 times per day - -the estimated cost for the month would be: - -| | Usage | Billable Quantity | Price | -| ------------------ | ---------------------------------------------------- | ----------------- | ----------- | -| Class B Operations | (1,000,000 assets) \* (2 reads per day) \* (30 days) | 60,000,000 | $21.60 | -| Class A Operations | (1,000,000 assets) \* (1 write per day) \* (30 days) | 30,000,000 | $135.00 | -| Storage | (1,000,000 assets) \* (1MB per asset) | 1,000 GB-months | $15.00 | -| **TOTAL** | | | **$171.60** | -| | | | | - - - -## Tips and best practices - -Cache Reserve should be used with [Tiered Cache](/cache/how-to/tiered-cache/) enabled. Cache Reserve is designed for use with Tiered Cache enabled for maximum origin shielding. Using Cache Reserve without Tiered Cache may result in higher storage operation costs. Enabling Cache Reserve via the Cloudflare dashboard will check and provide a warning if you try to use Cache Reserve without Tiered Cache enabled. - -## Cache Reserve Analytics - -Cache Reserve Analytics provides insights regarding your Cache Reserve usage. It allows you to check what content is stored in Cache Reserve, how often it is being accessed, how long it has been there and how much egress from your origin it is saving you. - -In the **Overview** section, under **Cache Reserve**, you have access to the following metrics: - -- **Egress savings (bandwidth)** - is an estimation based on response bytes served from Cache Reserve that did not need to be served from your origin server. These are represented as cache hits. -- **Requests served by Cache Reserve** - is the number of requests served by Cache Reserve (total). -- **Data storage summary** - is based on a representative sample of requests. Refer to [Sampling](/analytics/graphql-api/sampling/) for more details about how Cloudflare samples data. - - **Current data stored** - is the data stored (currently) over time. - - **Aggregate storage usage** - is the total of storage used for the selected timestamp. -- **Operations** - [Class A](/cache/advanced-configuration/cache-reserve/#class-a-operations-writes) (writes) and [Class B](/cache/advanced-configuration/cache-reserve/#class-b-operations-reads) (reads) operations over time. - -## Cache Reserve clear button - -You can remove all data stored in Cache Reserve through the dashboard or via API. To clear your cache reserve: - -- Cache Reserve must have already been enabled for the zone. -- Cache Reserve needs to be off. - -Be aware that the deletion may take up to 24 hours to complete. - - - -1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/login) and select a domain. -2. Go to **Caching** > **Cache Reserve**. -3. In **Delete Cache Reserve Data**, select **Delete Storage**. - - - -To delete Cache Reserve data via API use the following example requests. For more information, refer to the [API documentation](/api/resources/cache/subresources/cache_reserve/methods/clear/). - -```bash title="Request 1: Get Cache Reserve status" -curl https://api.cloudflare.com/client/v4/zones/{zone_id}/cache/cache_reserve \ ---header "Authorization: Bearer " -``` - -```json title="Response" -{ - "result": { - "editable": true, - "id": "cache_reserve", - "value": "off" - }, - "success": true, - "errors": [], - "messages": [] -} -``` - -If Cache Reserve is turned off, you can proceed to the Cache Reserve Clear operation. - -```bash title="Request 2: Start Cache Reserve Clear" -curl --request POST \ -https://api.cloudflare.com/client/v4/zones/{zone_id}/cache/cache_reserve_clear \ ---header "Authorization: Bearer " -``` - -```json title="Response" -{ - "result": { - "id": "cache_reserve_clear", - "start_ts": "2024-06-02T10:00:00.12345Z", - "state": "In-progress" - }, - "success": true, - "errors": [], - "messages": [] -} -``` - - diff --git a/src/content/docs/cache/concepts/cache-control.mdx b/src/content/docs/cache/concepts/cache-control.mdx index d1b531da897fd9d..d7ca0bdddaa7b06 100644 --- a/src/content/docs/cache/concepts/cache-control.mdx +++ b/src/content/docs/cache/concepts/cache-control.mdx @@ -4,6 +4,7 @@ pcx_content_type: concept head: - tag: title content: Origin Cache Control +description: Learn how the 'cache-control' header works with Cloudflare's Origin Cache Control feature, which ensures that Cloudflare respects caching directives from your origin server. --- @@ -24,7 +25,7 @@ In the following sections, we will provide more details regarding: * How Origin Cache Control behaves with `Cache-Control` directives. * How other Cloudflare products interact with `Cache-Control` directives. -## `Cache-control` directives +## `Cache-control` header 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. diff --git a/src/content/docs/cache/concepts/cache-responses.mdx b/src/content/docs/cache/concepts/cache-responses.mdx index 98de0047edb5d40..6ff480a6d0db611 100644 --- a/src/content/docs/cache/concepts/cache-responses.mdx +++ b/src/content/docs/cache/concepts/cache-responses.mdx @@ -47,7 +47,7 @@ The resource was served from Cloudflare's cache but was expired. Cloudflare coul ## BYPASS -The origin web server instructed Cloudflare to bypass cache via a `Cache-Control` header set to `no-cache`, `private`, or `max-age=0` even though Cloudflare originally preferred to cache the asset. BYPASS is returned when enabling [Origin Cache-Control](/cache/concepts/cache-control/). Cloudflare also sets BYPASS when your origin web server sends cookies in the response header. If the Request to your origin web server includes an `Authorization` header, in some cases the response will also be BYPASS. Refer to [Conditions](/cache/concepts/cache-control/#conditions) in the Origin Cache-Control behavior section for more details. +The origin web server instructed Cloudflare to bypass cache via a [`Cache-Control` header](/cache/concepts/cache-control/) set to `no-cache`, `private`, or `max-age=0` even though Cloudflare originally preferred to cache the asset. BYPASS is returned when enabling [Origin Cache-Control](/cache/concepts/cache-control/). Cloudflare also sets BYPASS when your origin web server sends cookies in the response header. If the Request to your origin web server includes an `Authorization` header, in some cases the response will also be BYPASS. Refer to [Conditions](/cache/concepts/cache-control/#conditions) in the Origin Cache-Control behavior section for more details. ## REVALIDATED diff --git a/src/content/docs/cache/concepts/customize-cache.mdx b/src/content/docs/cache/concepts/customize-cache.mdx index b46785da63734cb..71fef678e3e7522 100644 --- a/src/content/docs/cache/concepts/customize-cache.mdx +++ b/src/content/docs/cache/concepts/customize-cache.mdx @@ -27,4 +27,4 @@ For example, add a `static=true` query string for resources at your origin web s * Using the Expression Builder: `Hostname contains "example.com" AND URI Query String contains "static=true"` * Using the Expression Editor: `(http.host contains "example.com" and http.request.uri.query contains "static=true")` -Resources that match a Cache Everything Cache Rule are still not cached if the origin web server sends a Cache-Control header of `max-age=0`, `private`, `no-cache`, or an `Expires` header with an already expired date. Include the [Edge Cache TTL](/cache/how-to/cache-rules/settings/#edge-ttl) setting within the Cache Everything Cache Rule to additionally override the `Cache-Control` headers from the origin web server. +Resources that match a Cache Everything Cache Rule are still not cached if the origin web server sends a [Cache-Control header](/cache/concepts/cache-control/) of `max-age=0`, `private`, `no-cache`, or an `Expires` header with an already expired date. Include the [Edge Cache TTL](/cache/how-to/cache-rules/settings/#edge-ttl) setting within the Cache Everything Cache Rule to additionally override the `Cache-Control` headers from the origin web server. diff --git a/src/content/docs/cache/concepts/default-cache-behavior.mdx b/src/content/docs/cache/concepts/default-cache-behavior.mdx index 6e3699e10951132..122608d25606600 100644 --- a/src/content/docs/cache/concepts/default-cache-behavior.mdx +++ b/src/content/docs/cache/concepts/default-cache-behavior.mdx @@ -12,7 +12,7 @@ import { FeatureTable } from "~/components" Cloudflare respects the origin web server’s cache headers in the following order unless an [Edge Cache TTL cache rule](/cache/how-to/cache-rules/settings/#edge-ttl) overrides the headers. Refer to the [Edge TTL](/cache/how-to/configure-cache-status-code/#edge-ttl) section for details on default TTL behavior. * Cloudflare **does not** cache the resource when: - * The `Cache-Control` header is set to `private`, `no-store`, `no-cache`, or `max-age=0`. + * The [`Cache-Control` header](/cache/concepts/cache-control/) is set to `private`, `no-store`, `no-cache`, or `max-age=0`. * The [Set-Cookie header](/cache/concepts/cache-behavior/#interaction-of-set-cookie-response-header-with-cache) exists. * The HTTP request method is anything other than a `GET`. * Cloudflare **does** cache the resource when: diff --git a/src/content/docs/cache/how-to/cache-rules/examples/cache-ttl-by-status-code.mdx b/src/content/docs/cache/how-to/cache-rules/examples/cache-ttl-by-status-code.mdx index 1afb486d7ba77c2..bb96c9c88248243 100644 --- a/src/content/docs/cache/how-to/cache-rules/examples/cache-ttl-by-status-code.mdx +++ b/src/content/docs/cache/how-to/cache-rules/examples/cache-ttl-by-status-code.mdx @@ -24,7 +24,7 @@ import { Example, Render } from "~/components" * **Then**: * **Cache eligibility**: Eligible for cache * **Setting**: Edge TTL - * Use cache-control header if present, use default Cloudflare caching behavior if not + * Use [cache-control header](/cache/concepts/cache-control/) if present, use default Cloudflare caching behavior if not * **Status code TTL**: * **Scope**: *Range* * **From**: *200* diff --git a/src/content/docs/cache/how-to/cache-rules/settings.mdx b/src/content/docs/cache/how-to/cache-rules/settings.mdx index acd93f0e0232186..26c2309f742a3bb 100644 --- a/src/content/docs/cache/how-to/cache-rules/settings.mdx +++ b/src/content/docs/cache/how-to/cache-rules/settings.mdx @@ -81,7 +81,7 @@ If you use cache rules, image transformations, and zone versioning simultaneousl Edge Cache TTL refers to the maximum cache time-to-live (TTL), or how long an asset should be considered fresh or available to serve from Cloudflare’s cache in response to requests. This setting has three primary options: -- **Use cache control-header if present, bypass cache if not**: If a cache-control header is present on the response, follow its directives. If not, skip caching entirely. +- **Use cache control-header if present, bypass cache if not**: If a [cache-control header](/cache/concepts/cache-control/) is present on the response, follow its directives. If not, skip caching entirely. - **Use cache-control header if present, use default Cloudflare caching behavior if not**: If a cache-control header is present on the response, follow its directives. If not, cache in accordance with our [default edge TTL settings](/cache/how-to/configure-cache-status-code/#edge-ttl). - **Ignore cache-control header and use this TTL**: Completely ignore any cache-control header on the response and instead cache the response for a duration specified in the timing dropdown. @@ -93,7 +93,7 @@ API configuration object name: `"edge_ttl"`. | API values | Configuration | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------- | -| `respect_origin` | Use cache-control header if present, use default [Cloudflare caching behavior](/cache/concepts/default-cache-behavior/) if not. | +| `respect_origin` | Use [cache-control header](/cache/concepts/cache-control/) if present, use default [Cloudflare caching behavior](/cache/concepts/default-cache-behavior/) if not. | | `override_origin` | Ignore cache-control header and use this TTL. | | `bypass_by_default` | Use cache control-header if present, bypass cache if not. | | | | diff --git a/src/content/docs/cache/how-to/edge-browser-cache-ttl/index.mdx b/src/content/docs/cache/how-to/edge-browser-cache-ttl/index.mdx index 5da33532b8b6067..027a0010c7c16bd 100644 --- a/src/content/docs/cache/how-to/edge-browser-cache-ttl/index.mdx +++ b/src/content/docs/cache/how-to/edge-browser-cache-ttl/index.mdx @@ -16,7 +16,7 @@ For more information on how to set up Edge Cache TTL, refer to [Cache rules](/ca ## Browser Cache TTL -The Browser Cache TTL sets the expiration for resources cached in a visitor’s browser. By default, Cloudflare honors the cache expiration set in your `Expires` and `Cache-Control` headers but overrides those headers if: +The Browser Cache TTL sets the expiration for resources cached in a visitor’s browser. By default, Cloudflare honors the cache expiration set in your `Expires` and [`Cache-Control` headers](/cache/concepts/cache-control/) but overrides those headers if: * The value of the `Expires` or `Cache-Control` header from the origin web server is less than the Browser Cache TTL Cloudflare setting. * The origin web server does not send a `Cache-Control` or an `Expires` header. @@ -28,7 +28,7 @@ Unless specifically set in a cache rule, Cloudflare does not override or insert * Setting high Browser Cache TTL values means that the assets will be cached for a long time by users’ browsers. * If you modify cached assets, the new assets may not be displayed to repeat visitors before the Browser Cache TTL expires. -* Purging Cloudflare’s cache does not affect assets stored by a visitor’s browser. +* Purging Cloudflare’s cache does not affect assets stored by a visitor’s browser. ::: diff --git a/src/content/docs/cache/how-to/edge-browser-cache-ttl/set-browser-ttl.mdx b/src/content/docs/cache/how-to/edge-browser-cache-ttl/set-browser-ttl.mdx index 7de3391d9efb346..05f49d8bad11b7c 100644 --- a/src/content/docs/cache/how-to/edge-browser-cache-ttl/set-browser-ttl.mdx +++ b/src/content/docs/cache/how-to/edge-browser-cache-ttl/set-browser-ttl.mdx @@ -8,7 +8,7 @@ sidebar: Specify a time for a visitor’s Browser Cache TTL to accelerate the page load for repeat visitors to your website. To configure cache duration within Cloudflare’s data centers, refer to [Edge Cache TTL](/cache/how-to/cache-rules/settings/#edge-ttl). -By default, Cloudflare honors the cache expiration set in your `Expires` and `Cache-Control` headers. Cloudflare overrides any `Cache-Control` or `Expires` headers with values set via the **Browser Cache TTL** option under **Caching** on your dashboard if: +By default, Cloudflare honors the cache expiration set in your `Expires` and [`Cache-Control` headers](/cache/concepts/cache-control/). Cloudflare overrides any `Cache-Control` or `Expires` headers with values set via the **Browser Cache TTL** option under **Caching** on your dashboard if: * The value of the `Cache-Control` header from the origin web server is less than the **Browser Cache TTL** setting. This means that **Browser cache TTL** value needs to be higher than origin `max-age`. * The origin web server does not send a `Cache-Control` or an `Expires` header. @@ -33,7 +33,7 @@ If you modify cached assets, the new asset is not displayed to repeat visitors b 2. Select **Caching**. 3. Under **Browser Cache TTL**, select the drop-down menu to select the desired cache expiration time. -The **Respect Existing Headers** option tells Cloudflare to honor the settings in the `Cache-Control` headers from your origin web server. +The **Respect Existing Headers** option tells Cloudflare to honor the settings in the [`Cache-Control` headers](/cache/concepts/cache-control/) from your origin web server. :::note[Respect Existing Headers Availability] diff --git a/src/content/docs/rules/reference/page-rules-migration.mdx b/src/content/docs/rules/reference/page-rules-migration.mdx index c0ff15103f10fca..a0df94693f4640c 100644 --- a/src/content/docs/rules/reference/page-rules-migration.mdx +++ b/src/content/docs/rules/reference/page-rules-migration.mdx @@ -537,7 +537,7 @@ You configured a Page Rule turning on caching of every response with status code - **Then**: - **Cache eligibility**: Eligible for cache - **Setting**: Edge TTL - - Use cache-control header if present, use default Cloudflare caching behavior if not + - Use [cache-control header](/cache/concepts/cache-control/) if present, use default Cloudflare caching behavior if not - **Status code TTL**: - **Scope**: _Range_ - **From**: _200_ @@ -803,7 +803,7 @@ You configured a Page Rule adjusting Edge Cache TTL for all subdomains of `examp - **Then**: - **Cache eligibility**: Eligible for cache - **Setting**: Edge TTL - - Ignore cache-control header and use this TTL + - Ignore [cache-control header](/cache/concepts/cache-control/) and use this TTL - **Input time-to-live (TTL)**: _1 day_ diff --git a/src/content/docs/workers/reference/how-the-cache-works.mdx b/src/content/docs/workers/reference/how-the-cache-works.mdx index dd07997dc0a0c13..9fba9039b9f448e 100644 --- a/src/content/docs/workers/reference/how-the-cache-works.mdx +++ b/src/content/docs/workers/reference/how-the-cache-works.mdx @@ -74,7 +74,7 @@ Assets stored in the cache through [Cache API](/workers/runtime-apis/cache/) ope ## Edge versus browser caching -The browser cache is controlled through the `Cache-Control` header sent in the response to the client (the `Response` instance return from the handler). Workers can customize browser cache behavior by setting this header on the response. +The browser cache is controlled through the [`Cache-Control` header](/cache/concepts/cache-control/) sent in the response to the client (the `Response` instance return from the handler). Workers can customize browser cache behavior by setting this header on the response. Other means to control Cloudflare’s cache that are not mentioned in this documentation include: Page Rules and Cloudflare cache settings. Refer to the [How to customize Cloudflare’s cache](/cache/concepts/customize-cache/) if you wish to avoid writing JavaScript with still some granularity of control.