<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-no-vary-search-09" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="No-Vary-Search">The No-Vary-Search HTTP Caching Extension</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-no-vary-search-09"/>
    <author fullname="Domenic Denicola">
      <organization>Google LLC</organization>
      <address>
        <email>d@domenic.me</email>
      </address>
    </author>
    <author fullname="Jeremy Roman">
      <organization>Google LLC</organization>
      <address>
        <email>jbroman@chromium.org</email>
      </address>
    </author>
    <author fullname="Nidhi Jaju" role="editor">
      <organization>Google LLC</organization>
      <address>
        <email>nidhijaju@chromium.org</email>
      </address>
    </author>
    <date year="2026" month="August" day="17"/>
    <area>Web and Internet Transport</area>
    <workgroup>HyperText Transfer Protocol</workgroup>
    <keyword>http</keyword>
    <keyword>caching</keyword>
    <abstract>
      <?line 108?>

<t>This specification defines an extension to HTTP Caching, changing how the URI query component impacts caching. It introduces the <tt>"No-Vary-Search"</tt> response header field, which allows origin servers to signal to caches that certain parts of the query component do not semantically affect the served response and can be ignored for cache matching purposes.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://httpwg.org/http-extensions/draft-ietf-httpbis-no-vary-search.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-httpbis-no-vary-search/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        HTTP Working Group mailing list (<eref target="mailto:ietf-http-wg@w3.org"/>),
        which is archived at <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/"/>.
        Working Group information can be found at <eref target="https://httpwg.org/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/httpwg/http-extensions/labels/no-vary-search"/>.</t>
    </note>
  </front>
  <middle>
    <?line 112?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>HTTP caching <xref target="HTTP-CACHING"/> is based on reusing resources which match across a number of cache keys, with the most important one being the presented target URI (<xref section="7.1" sectionFormat="of" target="HTTP"/>). However, sometimes multiple URIs can represent the same resource. This leads to caches not always being as helpful as they could be: if the cache contains a response under one URI, but the response is then requested under another, the cached version will be ignored.</t>
      <t>The "No-Vary-Search" response header field defines a caching extension, as described in <xref section="4" sectionFormat="of" target="HTTP-CACHING"/>, that tackles a specific subset of this general problem, for when different URIs that differ only in their query component identify the same resource. It allows resources to declare that some or all parts of the query component do not semantically affect the served response, and thus can be ignored for cache matching purposes. This is achieved by interpreting the query component as a sequence of parameters encoded using the <tt>application/x-www-form-urlencoded</tt> format <xref target="WHATWG-URL"/>. For example, if the order of the parameters within the query component does not affect which resource is identified, this is indicated using</t>
      <sourcecode type="http-message"><![CDATA[
No-Vary-Search: key-order
]]></sourcecode>
      <t>If specific query parameters (e.g., ones indicating something for analytics) do not semantically affect the served resource, this is indicated using</t>
      <sourcecode type="http-message"><![CDATA[
No-Vary-Search: params=("utm_source" "utm_medium" "utm_campaign")
]]></sourcecode>
      <t>And if the resource instead wants to take an allowlist-based approach, where only certain known query parameters semantically affect the served response, they can use</t>
      <sourcecode type="http-message"><![CDATA[
No-Vary-Search: except=("productId")
]]></sourcecode>
      <t>Note that "cache busting", the practice of changing a part of the query component to create a distinct cache key and force retrieval of a newer response, can be made ineffective by the <tt>"No-Vary-Search"</tt> response header field.</t>
      <t><xref target="header-definition"/> defines the new <tt>"No-Vary-Search"</tt> response header field, using the <xref target="STRUCTURED-FIELDS"/> framework. <xref target="data-model"/> and <xref target="parsing"/> illustrate the data model for how the field value can be represented in specifications, and the process for parsing the raw output from the structured field parser into that data model. <xref target="comparing"/> gives the key algorithm for comparing if two URLs are equivalent under the influence of the header field; notably, it leans on the decomposition of the query component into keys and values given by the <eref target="https://url.spec.whatwg.org/#concept-urlencoded">application/x-www-form-urlencoded</eref> format specified in <xref target="WHATWG-URL"/>. (As such, this header field is not useful for URLs whose query component does not follow that format.) Finally, <xref target="caching"/> explains how to extend <xref section="4" sectionFormat="of" target="HTTP-CACHING"/> to take this new equivalence into account.</t>
      <t>From a deployment perspective, this extension is implemented by HTTP caches, including browser caches, content delivery networks, and forward proxies. Origin servers send the <tt>"No-Vary-Search"</tt> response header field to provide instructions to these caches. Caches that implement this extension use these instructions to determine when a previously stored response can be safely reused for a new request, even if the query components of the target URIs differ.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>In this document, the terms "URI" and "URL" are used interchangeably, depending on context. "URI" is used in the context of <xref target="URI"/>, <xref target="HTTP"/>, and <xref target="HTTP-CACHING"/>, whereas "URL" is used in the context of the algorithms specified in <xref target="WHATWG-URL"/>.</t>
      <t>The term "query parameters" in this document refers to the keys and values resulting from parsing a URL's query component using the <eref target="https://url.spec.whatwg.org/#concept-urlencoded">application/x-www-form-urlencoded</eref> format <xref target="WHATWG-URL"/>.</t>
      <t>This document also adopts some conventions and notation typical in WHATWG and W3C usage, especially as it relates to algorithms. See <xref target="WHATWG-INFRA"/>, and in particular:</t>
      <ul spacing="normal">
        <li>
          <t>its definition of lists, including the list literal notation « 1, 2, 3 ».</t>
        </li>
        <li>
          <t>its definition of strings, including their representation as code units.</t>
        </li>
      </ul>
      <t>(Other concepts used are called out using inline references.)</t>
    </section>
    <section anchor="header-definition">
      <name>HTTP header field definition</name>
      <t>The <tt>"No-Vary-Search"</tt> response header field is a structured field <xref target="STRUCTURED-FIELDS"/> whose value <bcp14>MUST</bcp14> be a dictionary (<xref section="3.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
      <t>It has the following constraints:</t>
      <ul spacing="normal">
        <li>
          <t>If present, the <tt>key-order</tt> entry's value <bcp14>MUST</bcp14> be a boolean (<xref section="3.3.6" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
        </li>
        <li>
          <t>If present, the <tt>params</tt> entry's value <bcp14>MUST</bcp14> be an inner list of strings (<xref section="3.1.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
        </li>
        <li>
          <t>If present, the <tt>except</tt> entry's value <bcp14>MUST</bcp14> be an inner list of strings (<xref section="3.1.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
        </li>
        <li>
          <t>The <tt>except</tt> entry <bcp14>MUST NOT</bcp14> be present if the <tt>params</tt> entry is also present.</t>
        </li>
      </ul>
      <t>The dictionary <bcp14>MAY</bcp14> contain entries whose keys are not one of <tt>key-order</tt>, <tt>params</tt>, and <tt>except</tt>, but their meaning is not defined by this specification. Implementations of this specification will ignore such entries (but future documents might assign meaning to such entries). Future extensions to this dictionary <bcp14>MUST NOT</bcp14> restrict the set of URIs that are considered equivalent; they can only expand it. If a future extension requires restricting equivalence, it <bcp14>MUST</bcp14> be deployed as a new HTTP header field to ensure safety.</t>
      <t>The <tt>"No-Vary-Search"</tt> response header field is set by origin servers. Intermediaries <bcp14>MUST NOT</bcp14> insert, delete, or modify the field's value unless they are acting as the origin server for that response.</t>
      <aside>
        <t>A parsing algorithm is defined in <xref target="obtain-a-url-variation-config"/>.</t>
      </aside>
    </section>
    <section anchor="data-model">
      <name>Data model</name>
      <t>A <em>URL variation config</em> consists of the following:</t>
      <dl newline="true">
        <dt>no-vary params</dt>
        <dd>
          <t>either the special value <strong>wildcard</strong> or a list of strings</t>
        </dd>
        <dt>vary params</dt>
        <dd>
          <t>either the special value <strong>wildcard</strong> or a list of strings</t>
        </dd>
        <dt>vary on key order</dt>
        <dd>
          <t>a boolean</t>
        </dd>
      </dl>
      <t><iref item="default URL variation config" primary="true"/>
The <em><iref item="default URL variation config"/>default URL variation config</em> is a URL variation config whose no-vary params is an empty list, vary params is <strong>wildcard</strong>, and vary on key order is true.</t>
      <t>The <iref item="obtain a URL variation config"/><xref target="obtain-a-url-variation-config" format="none">obtain a URL variation config</xref> algorithm (<xref target="obtain-a-url-variation-config"/>) ensures that all URL variation configs obey the following constraints:</t>
      <ul spacing="normal">
        <li>
          <t>vary params is a list if and only if the no-vary params is <strong>wildcard</strong>; and</t>
        </li>
        <li>
          <t>no-vary params is a list if and only if the vary params is <strong>wildcard</strong>.</t>
        </li>
      </ul>
    </section>
    <section anchor="parsing">
      <name>Parsing</name>
      <section anchor="parse-a-url-variation-config">
        <name>Parse a URL variation config</name>
        <t><iref item="parse a URL variation config" primary="true"/>
To <em><iref item="parse a URL variation config"/><xref target="parse-a-url-variation-config" format="none">parse a URL variation config</xref></em> given <em>value</em>:</t>
        <ol spacing="normal" type="1"><li>
            <t>If <em>value</em> is null, then return the <iref item="default URL variation config"/>default URL variation config.</t>
          </li>
          <li>
            <t>Let <em>result</em> be a new URL variation config.</t>
          </li>
          <li>
            <t>Set <em>result</em>'s vary on key order to true.</t>
          </li>
          <li>
            <t>If <em>value</em>["<tt>key-order</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>Let <em>keyOrderValue</em> be the <tt>item_or_inner_list</tt> component of the tuple <em>value</em>["<tt>key-order</tt>"] (ignoring any parameters).</t>
              </li>
              <li>
                <t>If <em>keyOrderValue</em> is not a boolean, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s vary on key order to the boolean negation of <em>keyOrderValue</em>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If both <em>value</em>["<tt>params</tt>"] and <em>value</em>["<tt>except</tt>"] exist, then return the <iref item="default URL variation config"/>default URL variation config.</t>
          </li>
          <li>
            <t>If neither <em>value</em>["<tt>params</tt>"] nor <em>value</em>["<tt>except</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>Set <em>result</em>'s no-vary params to an empty list.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s vary params to <strong>wildcard</strong>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If <em>value</em>["<tt>params</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>Let <em>paramsValue</em> be the <tt>item_or_inner_list</tt> component of the tuple <em>value</em>["<tt>params</tt>"] (ignoring any parameters).</t>
              </li>
              <li>
                <t>If <em>paramsValue</em> is not an inner list, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Let <em>paramsList</em> be a list containing the <tt>bare_item</tt> component of each tuple in <em>paramsValue</em> (ignoring any parameters).</t>
              </li>
              <li>
                <t>If any item in <em>paramsList</em> is not a string, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s no-vary params to the result of applying <iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref> (<xref target="parse-a-key"/>) to each item in <em>paramsList</em>.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s vary params to <strong>wildcard</strong>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>Otherwise, if <em>value</em>["<tt>except</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>Let <em>exceptValue</em> be the <tt>item_or_inner_list</tt> component of the tuple <em>value</em>["<tt>except</tt>"] (ignoring any parameters).</t>
              </li>
              <li>
                <t>If <em>exceptValue</em> is not an inner list, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Let <em>exceptList</em> be a list containing the <tt>bare_item</tt> component of each tuple in <em>exceptValue</em> (ignoring any parameters).</t>
              </li>
              <li>
                <t>If any item in <em>exceptList</em> is not a string, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s vary params to the result of applying <iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref> (<xref target="parse-a-key"/>) to each item in <em>exceptList</em>.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s no-vary params to <strong>wildcard</strong>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>Return <em>result</em>.</t>
          </li>
        </ol>
        <aside>
          <t>In general, this algorithm is strict and tends to return the <iref item="default URL variation config"/>default URL variation config whenever it sees something it doesn't recognize. This is because the <iref item="default URL variation config"/>default URL variation config behavior will just cause fewer cache hits, which is an acceptable fallback behavior.</t>
        </aside>
        <aside>
          <t>The input to this algorithm is generally obtained by parsing a structured field (<xref section="4.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>) using field_type "dictionary".</t>
        </aside>
      </section>
      <section anchor="obtain-a-url-variation-config">
        <name>Obtain a URL variation config</name>
        <t><iref item="obtain a URL variation config" primary="true"/>
To <em><iref item="obtain a URL variation config"/><xref target="obtain-a-url-variation-config" format="none">obtain a URL variation config</xref></em> given an HTTP response (<xref section="3.4" sectionFormat="of" target="HTTP"/>) <em>response</em>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Let <em>fieldValue</em> be the result of parsing the <tt>"No-Vary-Search"</tt> response header field from <em>response</em> as a Dictionary (<xref section="4.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>). If parsing fails or the field is absent, let <em>fieldValue</em> be null.</t>
          </li>
          <li>
            <t>Return the result of parsing a URL variation config (<xref target="parse-a-url-variation-config"/>) given <em>fieldValue</em>. <iref item="parse a URL variation config"/></t>
          </li>
        </ol>
        <section anchor="examples">
          <name>Examples</name>
          <t>The following illustrates how various inputs are parsed, in terms of their impact on the resulting no-vary params and vary params:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Input</th>
                <th align="left">Result</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: key-order</tt></td>
                <td align="left">no-vary params: (empty list)<br/>vary params: <strong>wildcard</strong><br/>vary on key order: false</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=("a")</tt></td>
                <td align="left">no-vary params: « "<tt>a</tt>" »<br/>vary params: <strong>wildcard</strong></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except=("x")</tt></td>
                <td align="left">no-vary params: <strong>wildcard</strong><br/>vary params: « "<tt>x</tt>" »</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=()</tt></td>
                <td align="left">no-vary params: (empty list)<br/>vary params: <strong>wildcard</strong></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except=()</tt></td>
                <td align="left">no-vary params: <strong>wildcard</strong><br/>vary params: (empty list)</td>
              </tr>
            </tbody>
          </table>
          <t>The following inputs are all invalid and will cause the <iref item="default URL variation config"/>default URL variation config to be returned:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Input</th>
                <th align="left">Explanation</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: key-order="not a boolean"</tt></td>
                <td align="left">
                  <tt>key-order</tt> expects a boolean, not a string</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params="not an inner list"</tt></td>
                <td align="left">
                  <tt>params</tt> expects an inner list, not a string</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=(not-a-string)</tt></td>
                <td align="left">
                  <tt>params</tt> items must be strings (tokens are invalid)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=?0</tt></td>
                <td align="left">
                  <tt>params</tt> expects an inner list, not a boolean</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=?1</tt></td>
                <td align="left">
                  <tt>params</tt> expects an inner list, not a boolean</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=?1, except=("x")</tt></td>
                <td align="left">
                  <tt>params</tt> and <tt>except</tt> cannot both be present</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=("a"), except=("x")</tt></td>
                <td align="left">
                  <tt>params</tt> and <tt>except</tt> cannot both be present</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=(), except=()</tt></td>
                <td align="left">
                  <tt>params</tt> and <tt>except</tt> cannot both be present</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except="not an inner list"</tt></td>
                <td align="left">
                  <tt>except</tt> expects an inner list, not a string</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except=(not-a-string)</tt></td>
                <td align="left">
                  <tt>except</tt> items must be strings (tokens are invalid)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except=?1</tt></td>
                <td align="left">
                  <tt>except</tt> expects an inner list, not a boolean</td>
              </tr>
            </tbody>
          </table>
          <t>The following inputs are valid, but somewhat unconventional. They are shown alongside their more conventional form.</t>
          <table>
            <thead>
              <tr>
                <th align="left">Input</th>
                <th align="left">Conventional form</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: key-order=?1</tt></td>
                <td align="left">
                  <tt>No-Vary-Search: key-order</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except=("x")</tt>, key-order</td>
                <td align="left">
                  <tt>No-Vary-Search: key-order, except=("x")</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=()</tt></td>
                <td align="left">(omit the header field)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: key-order=?0</tt></td>
                <td align="left">(omit the header field)</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="parse-a-key">
        <name>Parse a key</name>
        <t><iref item="parse a key" primary="true"/>
To <em><iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref></em> given an ASCII string <em>keyString</em>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Let <em>keyBytes</em> be the <eref target="https://infra.spec.whatwg.org/#isomorphic-encode">isomorphic encoding</eref> <xref target="WHATWG-INFRA"/> of <em>keyString</em>.</t>
          </li>
          <li>
            <t>Replace any 0x2B (+) in <em>keyBytes</em> with 0x20 (SP).</t>
          </li>
          <li>
            <t>Let <em>keyBytesDecoded</em> be the <eref target="https://url.spec.whatwg.org/#percent-decode">percent-decoding</eref> <xref target="WHATWG-URL"/> of <em>keyBytes</em>.</t>
          </li>
          <li>
            <t>Let <em>keyStringDecoded</em> be the <eref target="https://encoding.spec.whatwg.org/#utf-8-decode-without-bom">UTF-8 decoding without BOM</eref> <xref target="WHATWG-ENCODING"/> of <em>keyBytesDecoded</em>.</t>
          </li>
          <li>
            <t>Return <em>keyStringDecoded</em>.</t>
          </li>
        </ol>
        <section anchor="examples-1">
          <name>Examples</name>
          <t>The <iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref> algorithm allows encoding non-ASCII key strings in the ASCII structured header field format, similar to how the <eref target="https://url.spec.whatwg.org/#concept-urlencoded">application/x-www-form-urlencoded</eref> format <xref target="WHATWG-URL"/> allows encoding an entire entry list of keys and values in a URI (which is restricted to ASCII characters). For example:</t>
          <sourcecode type="http-message"><![CDATA[
No-Vary-Search: params=("%C3%A9+%E6%B0%97")
]]></sourcecode>
          <t>Notice that while the input string <tt>"%C3%A9+%E6%B0%97"</tt> consists entirely of ASCII characters (as required at the HTTP layer), the percent-decoding step used by the cache produces a non-ASCII result. This will result in a URL variation config whose no-vary params are « "<tt>é 気</tt>" ». Note that the "<tt>+</tt>" character in the encoded string is mapped to a space (SP). As explained in a later example, the canonicalization process during equivalence testing means this will treat as equivalent URIs such as:</t>
          <!-- link "a later example" and "equivalence testing" -->

<ul spacing="normal">
            <li>
              <t><tt>https://example.com/?é 気=1</tt></t>
            </li>
            <li>
              <t><tt>https://example.com/?é+気=2</tt></t>
            </li>
            <li>
              <t><tt>https://example.com/?%C3%A9%20気=3</tt></t>
            </li>
            <li>
              <t><tt>https://example.com/?%C3%A9+%E6%B0%97=4</tt></t>
            </li>
          </ul>
          <t>and so on, since they all are <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">parsed</eref> <xref target="WHATWG-URL"/> to having the same key "<tt>é 気</tt>".</t>
        </section>
      </section>
    </section>
    <section anchor="comparing">
      <name>Comparing</name>
      <t><iref item="equivalent modulo variation config" primary="true"/>
Two <eref target="https://url.spec.whatwg.org/#concept-url">URLs</eref> <xref target="WHATWG-URL"/> <em>urlA</em> and <em>urlB</em> are <em>equivalent modulo variation config</em> given a URL variation config <em>variationConfig</em> if the following algorithm returns true:</t>
      <ol spacing="normal" type="1"><li>
          <t>If the scheme, host, port, or path of <em>urlA</em> and <em>urlB</em> differ, then return false.</t>
        </li>
        <li>
          <t>If <em>variationConfig</em> is equivalent to the <iref item="default URL variation config"/>default URL variation config, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>If <em>urlA</em>'s query equals <em>urlB</em>'s query, then return true.</t>
            </li>
            <li>
              <t>Return false.</t>
            </li>
          </ol>
          <t>
In this case, even URL pairs that might appear the same after running the <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">application/x-www-form-urlencoded parser</eref> <xref target="WHATWG-URL"/> on their queries, such as <tt>https://example.com/a</tt> and <tt>https://example.com/a?</tt>, or <tt>https://example.com/foo?a=b&amp;&amp;&amp;c</tt> and <tt>https://example.com/foo?a=b&amp;c=</tt>, will be treated as inequivalent.</t>
        </li>
        <li>
          <t>Let <em>searchParamsA</em> and <em>searchParamsB</em> be empty lists.</t>
        </li>
        <li>
          <t>If <em>urlA</em>'s query is not null, then set <em>searchParamsA</em> to the result of running the <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">application/x-www-form-urlencoded parser</eref> <xref target="WHATWG-URL"/> given the <eref target="https://infra.spec.whatwg.org/#isomorphic-encode">isomorphic encoding</eref> <xref target="WHATWG-INFRA"/> of <em>urlA</em>'s query.</t>
        </li>
        <li>
          <t>If <em>urlB</em>'s query is not null, then set <em>searchParamsB</em> to the result of running the <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">application/x-www-form-urlencoded parser</eref> <xref target="WHATWG-URL"/> given the <eref target="https://infra.spec.whatwg.org/#isomorphic-encode">isomorphic encoding</eref> <xref target="WHATWG-INFRA"/> of <em>urlB</em>'s query.</t>
        </li>
        <li>
          <t>If <em>variationConfig</em>'s no-vary params is a list, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>Set <em>searchParamsA</em> to a list containing those items <em>pair</em> in <em>searchParamsA</em> where <em>variationConfig</em>'s no-vary params does not contain <em>pair</em>[0].</t>
            </li>
            <li>
              <t>Set <em>searchParamsB</em> to a list containing those items <em>pair</em> in <em>searchParamsB</em> where <em>variationConfig</em>'s no-vary params does not contain <em>pair</em>[0].</t>
            </li>
          </ol>
        </li>
        <li>
          <t>Otherwise, if <em>variationConfig</em>'s vary params is a list, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>Set <em>searchParamsA</em> to a list containing those items <em>pair</em> in <em>searchParamsA</em> where <em>variationConfig</em>'s vary params contains <em>pair</em>[0].</t>
            </li>
            <li>
              <t>Set <em>searchParamsB</em> to a list containing those items <em>pair</em> in <em>searchParamsB</em> where <em>variationConfig</em>'s vary params contains <em>pair</em>[0].</t>
            </li>
          </ol>
        </li>
        <li>
          <t>If <em>variationConfig</em>'s vary on key order is false, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>Let <em>keyLessThan</em> be an algorithm taking as inputs two pairs (<em>keyA</em>, <em>valueA</em>) and (<em>keyB</em>, <em>valueB</em>), which returns whether <em>keyA</em> is <eref target="https://infra.spec.whatwg.org/#code-unit-less-than">code unit less than</eref> <xref target="WHATWG-INFRA"/> <em>keyB</em>.</t>
            </li>
            <li>
              <t>Set <em>searchParamsA</em> to the result of <eref target="https://infra.spec.whatwg.org/#list-sort-in-ascending-order">sorting</eref> <xref target="WHATWG-INFRA"/> <em>searchParamsA</em> in ascending order with <em>keyLessThan</em>.</t>
            </li>
            <li>
              <t>Set <em>searchParamsB</em> to the result of <eref target="https://infra.spec.whatwg.org/#list-sort-in-ascending-order">sorting</eref> <xref target="WHATWG-INFRA"/> <em>searchParamsB</em> in ascending order with <em>keyLessThan</em>.</t>
            </li>
          </ol>
        </li>
        <li>
          <t>If <em>searchParamsA</em>'s size is not equal to <em>searchParamsB</em>'s size, then return false.</t>
        </li>
        <li>
          <t>Let <em>i</em> be 0.</t>
        </li>
        <li>
          <t>While <em>i</em> &lt; <em>searchParamsA</em>'s size:  </t>
          <ol spacing="normal" type="1"><li>
              <t>If <em>searchParamsA</em>[<em>i</em>][0] does not equal <em>searchParamsB</em>[<em>i</em>][0], then return false.</t>
            </li>
            <li>
              <t>If <em>searchParamsA</em>[<em>i</em>][1] does not equal <em>searchParamsB</em>[<em>i</em>][1], then return false.</t>
            </li>
            <li>
              <t>Set <em>i</em> to <em>i</em> + 1.</t>
            </li>
          </ol>
        </li>
        <li>
          <t>Return true.</t>
        </li>
      </ol>
      <section anchor="examples-2">
        <name>Examples</name>
        <t>Due to how the application/x-www-form-urlencoded parser canonicalizes query strings, there are some cases where query strings which do not appear obviously equivalent, will end up being treated as equivalent after parsing.</t>
        <t>So, for example, given any non-default value for the <tt>"No-Vary-Search"</tt> response header field, such as <tt>No-Vary-Search: key-order</tt>, we will have the following equivalences:</t>
        <table>
          <thead>
            <tr>
              <th align="left">First Query</th>
              <th align="left">Second Query</th>
              <th align="left">Explanation</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">null</td>
              <td align="left">
                <tt>?</tt></td>
              <td align="left">A null query is parsed the same as an empty string</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=x</tt></td>
              <td align="left">
                <tt>?%61=%78</tt></td>
              <td align="left">Parsing performs percent-decoding</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=é</tt></td>
              <td align="left">
                <tt>?a=%C3%A9</tt></td>
              <td align="left">Parsing performs percent-decoding</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=%f6</tt></td>
              <td align="left">
                <tt>?a=%ef%bf%bd</tt></td>
              <td align="left">An invalid UTF-8 sequence and the literal U+FFFD character are both parsed as U+FFFD (�)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=x&amp;&amp;&amp;&amp;</tt></td>
              <td align="left">
                <tt>?a=x</tt></td>
              <td align="left">Parsing splits on <tt>&amp;</tt> and discards empty strings</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=</tt></td>
              <td align="left">
                <tt>?a</tt></td>
              <td align="left">Both parse as having an empty string value for <tt>a</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=%20</tt></td>
              <td align="left">
                <tt>?a= &amp;</tt></td>
              <td align="left">
                <tt>%20</tt> is parsed as U+0020 SPACE</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=+</tt></td>
              <td align="left">
                <tt>?a= &amp;</tt></td>
              <td align="left">
                <tt>+</tt> is parsed as U+0020 SPACE</td>
            </tr>
          </tbody>
        </table>
        <t>Note that no Unicode normalization is performed during this comparison. For example, a query string of <tt>?a=%C3%A9</tt> (using the NFC encoding of <tt>é</tt>) and <tt>?a=e%CC%81</tt> (using the NFD encoding of <tt>é</tt>) will not be treated as equivalent.</t>
      </section>
    </section>
    <section anchor="caching">
      <name>Caching</name>
      <t>To reuse a stored response, <xref section="4" sectionFormat="of" target="HTTP-CACHING"/> requires that the presented target URI and that of the stored response match. If a cache implements the <tt>No-Vary-Search</tt> extension, this matching requirement is also satisfied if the URIs are equivalent modulo URL variation config (<xref target="comparing"/>) given the stored response's <tt>No-Vary-Search</tt> header.</t>
      <t>This document does not alter the requirements for cache invalidation (see Section 4.4 of <xref target="HTTP-CACHING"/>). A cache <bcp14>MAY</bcp14> invalidate stored responses for URIs that are equivalent modulo URL variation config, but is not required to do so. Therefore, state-changing requests might not invalidate all conceptually equivalent responses.</t>
      <t>Note that the <tt>"No-Vary-Search"</tt> response header field operates in addition to content negotiation and the <tt>Vary</tt> header field (see Section 4.1 of <xref target="HTTP-CACHING"/>).</t>
      <t>Cache implementations <bcp14>MAY</bcp14> fail to reuse a stored response whose target URI matches <em>only</em> modulo URL variation config, if the cache has a stored response with a more recent <tt>Date</tt> header field which:</t>
      <ul spacing="normal">
        <li>
          <t>has a target URI which is equal to the presented target URI, excluding the query, and</t>
        </li>
        <li>
          <t>has a non-empty value for the <tt>"No-Vary-Search"</tt> response header field, and</t>
        </li>
        <li>
          <t>has a <tt>"No-Vary-Search"</tt> response header field value different from the stored response being considered for reuse.</t>
        </li>
      </ul>
      <t>When a cache has multiple stored responses with conflicting <tt>"No-Vary-Search"</tt> values, preferring the response with the most recent <tt>Date</tt> header field helps ensure caches converge on the origin's latest caching policy.</t>
      <aside>
        <t>Caches aren't required to reuse stored responses, generally. However, the above expressly empowers caches to, if it is advantageous for performance or other reasons, search a smaller number of stored responses.</t>
        <t>That is, because caches might store more than one response for a given target URI path and authority, they need a way to efficiently look up the <tt>"No-Vary-Search"</tt> response header field value without accessing all cached responses. Such a cache might take steps like the following to identify a stored response in a performant way, before checking the other conditions in <xref section="4" sectionFormat="of" target="HTTP-CACHING"/>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Let exactMatch be cache[presentedTargetURI]. If it is a stored response that can be reused, return it.</t>
          </li>
          <li>
            <t>Let targetPath be presentedTargetURI, with query parameters removed.</t>
          </li>
          <li>
            <t>Let lastNVS be mostRecentNVS[targetPath]. If it does not exist, return null.</t>
          </li>
          <li>
            <t>Let simplifiedURL be the result of simplifying presentedTargetURI according to lastNVS (by removing query parameters which are not significant, and <eref target="https://infra.spec.whatwg.org/#list-sort-in-ascending-order">sorting</eref> <xref target="WHATWG-INFRA"/> parameters in ascending order by key, if key order is to be ignored).</t>
          </li>
          <li>
            <t>Let nvsMatch be cache[simplifiedURL]. If it does not exist, return null. (It is assumed that this was written when storing in the cache, in addition to the exact URL.)</t>
          </li>
          <li>
            <t>Let variationConfig be obtained (<xref target="obtain-a-url-variation-config"/>) from nvsMatch.</t>
          </li>
          <li>
            <t>If nvsMatch's target URI and presentedTargetURI are not equivalent modulo URL variation config (<xref target="comparing"/>) given variationConfig, then return null.</t>
          </li>
          <li>
            <t>If nvsMatch is a stored response that can be reused, return it. Otherwise, return null.</t>
          </li>
        </ol>
      </aside>
      <t>To aid cache implementation efficiency, servers <bcp14>SHOULD NOT</bcp14> send different non-empty values for the <tt>"No-Vary-Search"</tt> response header field in response to requests for a given target URI path and authority over time, unless there is a need to update how they handle the query component. Doing so would cause cache implementations that use a strategy like the above to miss some stored responses that could otherwise have been reused.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The main risk to be aware of is a cache returning a response that was originally fetched from a URL different from the one requested. In a web browser, this could cause the user to see a response fetched from a URL different from the one displayed when they hovered a link, or the URL displayed in the URL bar.</t>
      <t>For shared caches, such as CDNs or forward proxies, returning a response for a different URL carries the risk of cross-user state leakage. If a server incorrectly declares that a query parameter does not affect the response, but that parameter actually dictates user-specific or sensitive content, the shared cache might serve one user's personalized response to another user. However, because the origin strictly controls the <tt>"No-Vary-Search"</tt> response header field, it is the origin's responsibility to ensure that ignored parameters are safe to disregard for all users.</t>
      <t>The <tt>"No-Vary-Search"</tt> response header field alters the algorithm that caches use for URI identifier comparison. As discussed in <xref target="RFC6943"/>, altering identifier comparison logic can lead to security issues, primarily through "false positives" where two identifiers are incorrectly deemed equivalent.</t>
      <t>Because URL query parsing replaces invalid percent-encoded UTF-8 sequences with <tt>U+FFFD</tt>, lossy decoding can map distinct query strings onto the same cache key (for example, <tt>?a=%f6</tt> and <tt>?a=%ef%bf%bd</tt>). Origins should not rely on invalid percent-encoded sequences being distinguishable, as this is a concrete example of the false positives warned about in <xref target="RFC6943"/>.</t>
      <t>Incorrect configuration of this field can exacerbate cache poisoning or data leakage risks by causing such false positives. Origin servers <bcp14>MUST NOT</bcp14> declare a parameter as no-vary if doing so would bypass server processing required for safe response reuse. This includes parameters used for authorization, user identification, signature verification, user consent, routing, auditing, revocation, or any other security-sensitive operations.</t>
      <t>However, since the impact is limited to query parameters, this does not cross the relevant security boundary, which is the origin (<xref target="ORIGIN"/>). (See also the <eref target="https://url.spec.whatwg.org/#concept-url-host">host</eref> from <eref target="https://url.spec.whatwg.org/#url-rendering-simplification">the perspective of web browser security UI</eref> <xref target="WHATWG-URL"/>). Indeed, origins already have complete control over how they present URLs and response bodies, including on the client side via technology such as <eref target="https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-history-replacestate">history.replaceState()</eref> <xref target="HTML"/> or service workers.</t>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>This proposal is adjacent to the highly-privacy-relevant space of <eref target="https://privacycg.github.io/nav-tracking-mitigations/#terminology">navigational tracking</eref>, which often uses query parameters to pass along user identifiers. If an origin were to encode user identifiers in its URI, this proposal can reduce user tracking by private caches, since preventing server processing of such user IDs bypasses the server in favor of the cache. It does not interfere with <eref target="https://privacycg.github.io/nav-tracking-mitigations/#deployed-mitigations">existing navigational tracking mitigations</eref>, or any known future ones being contemplated. <xref target="NAV-TRACKING-MITIGATIONS"/></t>
      <t>However, this tracking reduction does not fully apply to shared caches (such as content delivery networks and forward proxies), which still receive the requests containing the identifiers. Furthermore, an errant configuration that incorrectly ignores parameters related to user identity or private state could expose cached content meant for one user to another. While this mistake can occur with standard caching, the <tt>"No-Vary-Search"</tt> response header field increases the surface area for such misconfigurations, making it critical that origins accurately classify their query parameters.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="http-field-names">
        <name>HTTP Field Names</name>
        <t>IANA is requested to enter the following into the Hypertext Transfer Protocol (HTTP) Field Name Registry (<eref target="https://www.iana.org/assignments/http-fields/http-fields.xhtml">https://www.iana.org/assignments/http-fields/http-fields.xhtml</eref>):</t>
        <dl>
          <dt>Field Name:</dt>
          <dd>
            <t><tt>No-Vary-Search</tt></t>
          </dd>
          <dt>Status:</dt>
          <dd>
            <t>permanent</t>
          </dd>
          <dt>Structured Type:</dt>
          <dd>
            <t>Dictionary</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>this document</t>
          </dd>
          <dt>Comments:</dt>
          <dd>
            <t>(none)</t>
          </dd>
        </dl>
      </section>
      <section anchor="no-vary-search-dictionary-keys-registry">
        <name>No-Vary-Search Dictionary Keys Registry</name>
        <t>IANA is requested to create a new registry, "No-Vary-Search Dictionary Keys", at <eref target="https://www.iana.org/assignments/http-fields/">https://www.iana.org/assignments/http-fields/</eref>.</t>
        <t>The registration policy is "IETF Review" (see Section 4.8 of <xref target="RFC8126"/>).</t>
        <t>A registration request <bcp14>MUST</bcp14> include the following fields:</t>
        <ul spacing="normal">
          <li>
            <t>Key: the dictionary key for the <tt>"No-Vary-Search"</tt> response header field</t>
          </li>
          <li>
            <t>Description: a brief description of the key's purpose</t>
          </li>
          <li>
            <t>Reference: a pointer to the specification that defines the key</t>
          </li>
        </ul>
        <t>The initial contents of this registry are:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Key</th>
              <th align="left">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>key-order</tt></td>
              <td align="left">Indicates if query parameter order affects caching</td>
              <td align="left">this document</td>
            </tr>
            <tr>
              <td align="left">
                <tt>params</tt></td>
              <td align="left">A list of query parameters that do not affect caching</td>
              <td align="left">this document</td>
            </tr>
            <tr>
              <td align="left">
                <tt>except</tt></td>
              <td align="left">A list of query parameters that affect caching</td>
              <td align="left">this document</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="URI">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="HTTP-CACHING">
          <front>
            <title>HTTP Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="STRUCTURED-FIELDS">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="September" year="2024"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields.</t>
              <t>This document obsoletes RFC 8941.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9651"/>
          <seriesInfo name="DOI" value="10.17487/RFC9651"/>
        </reference>
        <reference anchor="WHATWG-ENCODING" target="https://encoding.spec.whatwg.org/">
          <front>
            <title>Encoding Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date year="2026" month="May" day="21"/>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="WHATWG-INFRA" target="https://infra.spec.whatwg.org/">
          <front>
            <title>Infra Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <author initials="D." surname="Denicola" fullname="Domenic Denicola">
              <organization>Google LLC</organization>
            </author>
            <date year="2026" month="July" day="17"/>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="WHATWG-URL" target="https://url.spec.whatwg.org/">
          <front>
            <title>URL Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date year="2026" month="July" day="06"/>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="HTML" target="https://html.spec.whatwg.org/">
          <front>
            <title>HTML Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date year="2026" month="August" day="11"/>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="NAV-TRACKING-MITIGATIONS" target="https://privacycg.github.io/nav-tracking-mitigations/">
          <front>
            <title>Navigational-Tracking Mitigations</title>
            <author initials="P." surname="Snyder" fullname="Pete Snyder">
              <organization>Brave Software, Inc.</organization>
            </author>
            <author initials="J." surname="Yasskin" fullname="Jeffrey Yasskin">
              <organization>Google LLC</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>W3C Privacy CG</annotation>
        </reference>
        <reference anchor="ORIGIN">
          <front>
            <title>The Web Origin Concept</title>
            <author fullname="A. Barth" initials="A." surname="Barth"/>
            <date month="December" year="2011"/>
            <abstract>
              <t>This document defines the concept of an "origin", which is often used as the scope of authority or privilege by user agents. Typically, user agents isolate content retrieved from different origins to prevent malicious web site operators from interfering with the operation of benign web sites. In addition to outlining the principles that underlie the concept of origin, this document details how to determine the origin of a URI and how to serialize an origin into a string. It also defines an HTTP header field, named "Origin", that indicates which origins are associated with an HTTP request. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6454"/>
          <seriesInfo name="DOI" value="10.17487/RFC6454"/>
        </reference>
        <reference anchor="RFC6943">
          <front>
            <title>Issues in Identifier Comparison for Security Purposes</title>
            <author fullname="D. Thaler" initials="D." role="editor" surname="Thaler"/>
            <date month="May" year="2013"/>
            <abstract>
              <t>Identifiers such as hostnames, URIs, IP addresses, and email addresses are often used in security contexts to identify security principals and resources. In such contexts, an identifier presented via some protocol is often compared using some policy to make security decisions such as whether the security principal may access the resource, what level of authentication or encryption is required, etc. If the parties involved in a security decision use different algorithms to compare identifiers, then failure scenarios ranging from denial of service to elevation of privilege can result. This document provides a discussion of these issues that designers should consider when defining identifiers and protocols, and when constructing architectures that use multiple protocols.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6943"/>
          <seriesInfo name="DOI" value="10.17487/RFC6943"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
      </references>
    </references>
    <?line 510?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document benefited from valuable reviews and suggestions by:</t>
      <ul spacing="normal">
        <li>
          <t>Adam Rice</t>
        </li>
        <li>
          <t>Julian Reschke</t>
        </li>
        <li>
          <t>Kevin McNee</t>
        </li>
        <li>
          <t>Liviu Tinta</t>
        </li>
        <li>
          <t>Mark Nottingham</t>
        </li>
        <li>
          <t>Martin Thomson</t>
        </li>
        <li>
          <t>Valentin Gosu</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
9HWuq87/B7h91XAngAAA

-->

</rfc>
