<?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-06" 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-06"/>
    <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="July" day="06"/>
    <area>Web and Internet Transport</area>
    <workgroup>HyperText Transfer Protocol</workgroup>
    <keyword>http</keyword>
    <keyword>caching</keyword>
    <abstract>
      <?line 113?>

<t>This specification defines an extension to HTTP Caching, changing how URI query parameters impact caching.</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 117?>

<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 only differ in
certain query parameters 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. For example, if the order of the query parameters do 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" by sending unique query parameters to avoid retrieving a cached response can be made ineffective by the <tt>No-Vary-Search</tt> header field.</t>
      <t><xref target="header-definition"/> defines the new response header field <tt>No-Vary-Search</tt>, 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>
    </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> HTTP 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).</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>If <em>value</em>["<tt>key-order</tt>"] 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>value</em>["<tt>key-order</tt>"].</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If both <em>value</em>["<tt>params</tt>"] and <em>value</em>["<tt>except</tt>"] exist or neither exists, then return the <iref item="default URL variation config"/>default URL variation config.</t>
          </li>
          <li>
            <t>If <em>value</em>["<tt>params</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>If <em>value</em>["<tt>params</tt>"] is not an array, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>If any item in <em>value</em>["<tt>params</tt>"] 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>value</em>["<tt>params</tt>"].</t>
              </li>
              <li>
                <t>If any item in <em>result</em>'s no-vary params is an error, 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 <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>If <em>value</em>["<tt>except</tt>"] is not an array, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>If any item in <em>value</em>["<tt>except</tt>"] 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>value</em>["<tt>except</tt>"].</t>
              </li>
              <li>
                <t>If any item in <em>result</em>'s vary params is an error, 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 <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>
          <t>However, unrecognized keys at the top level are ignored, to make it easier to extend this specification in the future. To avoid misbehavior with existing client software, such extensions will likely expand, rather than reduce, the set of requests that a cached response can match.</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> field from <em>response</em> as a Dictionary (<xref section="4.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</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: 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>
          <ul spacing="compact">
            <li>
              <t><tt>No-Vary-Search: key-order="not a boolean"</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params="not an inner list"</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=(not-a-string)</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=?0</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=?1</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=?1, except=("x")</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=("a"), except=("x")</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=(), except=()</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: except="not an inner list"</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: except=(not-a-string)</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: except=?1</tt></t>
            </li>
          </ul>
          <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>will result in a URL variation config whose vary params are « "<tt>é 気</tt>" ». 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, username, password, 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 <tt>No-Vary-Search</tt>, 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">Both values are 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>
      </section>
    </section>
    <section anchor="caching">
      <name>Caching</name>
      <t>If a cache <xref target="HTTP-CACHING"/> implements this specification, the presented target URI requirement in <xref section="4" sectionFormat="of" target="HTTP-CACHING"/>:</t>
      <blockquote>
        <t>the presented target URI (Section 7.1 of <xref target="HTTP"/>) and that of the stored response match, and</t>
      </blockquote>
      <t>is replaced with:</t>
      <blockquote>
        <t>the presented target URI (Section 7.1 of <xref target="HTTP"/>) and that of the stored response match or are equivalent modulo URL variation config, and</t>
      </blockquote>
      <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 more recently stored a response 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> field, and</t>
        </li>
        <li>
          <t>has a <tt>No-Vary-Search</tt> field value different from the stored response being considered for reuse.</t>
        </li>
      </ul>
      <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 pathname, they need a way to efficiently look up the No-Vary-Search 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> field in response to requests for a given pathname 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 the impact of mismatched URLs. In particular, this could cause the user to see a response that was originally fetched from a URL different from the one displayed when they hovered a link, or the URL displayed in the URL bar.</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"/>). (Or perhaps just 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, we have already given origins complete control over how they present the (URL, response body) pair, 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> 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. However, we believe this proposal itself does not have privacy impacts. 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. Indeed, if a page were to encode user identifiers in its URI, the only ability this proposal gives is to <em>reduce</em> such user tracking by preventing server processing of such user IDs (since the server is bypassed in favor of the cache). <xref target="NAV-TRACKING-MITIGATIONS"/></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>
  </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="FETCH" target="https://fetch.spec.whatwg.org/">
          <front>
            <title>Fetch Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>WHATWG</annotation>
        </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>n.d.</date>
          </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>n.d.</date>
          </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>n.d.</date>
          </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>n.d.</date>
          </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>
      </references>
    </references>
    <?line 477?>

<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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
DTyIs0k81XEEL74nDxlePYt15vwfV/Px7kpjAAA=

-->

</rfc>
