GuidesHEADERS

What strict-origin-when-cross-origin means

strict-origin-when-cross-origin is the default Referrer-Policy in Chrome 85+, Firefox 87+ and Safari 15+, which is why DevTools shows it on almost every request, failed ones included; it only decides what goes in the Referer header and never blocks a request. On 28 October 2026 it sent the full URL to the same origin, only the origin to other HTTPS sites and no Referer from HTTPS to HTTP in Chromium 153, Firefox 155 and WebKit 26.6. The real failure is in the Console; if it is a missing CORS header on an API you don't control, the free cors.dev proxy (no signup, about 600 requests a minute per IP) adds it, but it forwards no Referer, so call referrer-restricted APIs directly.

What strict-origin-when-cross-origin sends

Referrer-Policy only decides what goes into the Referer request header and document.referrer. It never blocks a request and never causes a CORS error. Chrome DevTools shows Referrer Policy: strict-origin-when-cross-origin under General in the Headers tab for every request without another policy, which is why it sits next to failed requests too.

The W3C Referrer Policy spec makes strict-origin-when-cross-origin the default. A same-origin request sends the full URL without the fragment, a cross-origin request sends only the origin, and a request from HTTPS to plain HTTP sends nothing. A referrer longer than 4,096 characters is cut to the origin.

The test on 28 October 2026 loaded https://shop.example/checkout?order=123#pay with no policy set in Chromium 153, Firefox 155 and WebKit 26.6 (Playwright 1.63; WebKit is Playwright's Linux build) and sent cross-origin requests to the echo service https://httpbin.org/headers. new Request('/x').referrerPolicy was the empty string in all 3, which means the document's policy applies.

Referer sent from https://shop.example/checkout?order=123#pay, checked October 2026
RequestReferer sentBrowsers
Same-origin fetchhttps://shop.example/checkout?order=123All 3
Cross-origin fetch to HTTPShttps://shop.example/All 3
Navigation from HTTPS to HTTPNone, document.referrer emptyAll 3
fetch with referrerPolicy no-referrerNoneAll 3
fetch with unsafe-url in Chromiumhttps://shop.example/checkout?order=123Chromium 153
fetch with unsafe-url in Firefox and WebKithttps://shop.example/Firefox 155, WebKit 26.6

The default since Chrome 85, Firefox 87 and Safari 15

MDN's browser compatibility data (version 8.1.7) dates the default to Chrome 85, Firefox 87 and Safari 15; the Referrer-Policy header itself works since Chrome 56, Firefox 50 and Safari 11.1. The previous default, no-referrer-when-downgrade, sent the full URL, query string included, to every HTTPS site.

The same data marks the relaxed values unsafe-url, no-referrer-when-downgrade and origin-when-cross-origin as removed in Firefox 92 and Safari 13. In the test, a cross-site fetch() with referrerPolicy: 'unsafe-url' sent the full URL from Chromium only. Firefox and WebKit sent the origin, and Firefox logged Referrer Policy: Ignoring the less restricted referrer policy "unsafe-url" for the cross-site request: https://httpbin.org/headers (Firefox prints curly quotes).

Find the real error behind a failed request

  1. Read the Console

    the red line for the request names the actual reason, such as a CORS check, mixed content or a network error.

  2. Read the Status column

    in the Network panel, the Status of the failed row is what matters, not the Referrer Policy line under Headers.

What Chrome's Status column shows, and where to go next:

  • CORS error: the response lacked an acceptable Access-Control-Allow-Origin; see Access to fetch blocked by CORS policy.
  • (blocked:mixed-content): an HTTPS page requested an http:// URL; see mixed content.
  • (blocked:csp): the page's Content-Security-Policy blocked the request.
  • (failed) with a net::ERR_ code: DNS, TLS or connection trouble; see TypeError: Failed to fetch.
  • (canceled): the request was aborted, for example by a navigation or an AbortController.
  • A number such as 429: the server answered with an error; see 429 Too Many Requests.

If the cause is a missing CORS header on an API you don't control, https://proxy.cors.dev/ followed by the full URL adds it, with no signup, GET and HEAD only and about 600 requests a minute per IP.

When the Referer matters: referrer-restricted keys

Some services lock API keys to referring sites. Google Maps Platform keys with website restrictions are the common case, and Google's docs reserve IP-address restrictions for server-side web services, so browser code needs the referrer kind. When the Referer doesn't match, or is missing, the Maps JavaScript API fails with RefererNotAllowedMapError: "The current URL loading the Maps JavaScript API has not been added to the list of allowed referrers."

Google's Maps Embed docs warn that a page with a referrer meta tag of no-referrer or same-origin sends no Referer, which "may cause your API key restriction to reject the requests". They recommend referrerpolicy="strict-origin-when-cross-origin", which "Sends only your base domain (e.g., https://example.com/) to Google".

No proxy can pass the browser's Referer on. JavaScript can't set the Referer header, the free cors.dev proxy forwards only Accept, Accept-Language, If-None-Match, If-Modified-Since and Range, and cors.dev Pro drops browser identity headers such as Referer and Origin. An echo service behind proxy.cors.dev received neither in the test. Call referrer-checked APIs straight from the page.

Change the policy for a page or a request

  • The Referrer-Policy response header sets the policy for the whole page.
  • <meta name="referrer" content="strict-origin-when-cross-origin"> in the <head> does the same from HTML.
  • A referrerpolicy attribute works on a, img, iframe, script and link elements.
  • The referrerPolicy option of fetch() sets it for one request.

Stricter values such as no-referrer and same-origin hide even your origin from other sites, which breaks referrer-restricted keys. Looser values such as unsafe-url leak paths and query strings, which can hold tokens or order numbers, wherever the browser still honours them. The snippet asks https://httpbin.org/headers which Referer arrived under the default, then with no-referrer and unsafe-url.

See which Referer a cross-origin request sends
async function refererSentTo(url, init) {
  const response = await fetch(url, init);
  const { headers } = await response.json();
  return headers.Referer ?? '(none)';
}

const echo = 'https://httpbin.org/headers';

// On https://shop.example/checkout?order=123 this logs https://shop.example/
console.log(await refererSentTo(echo));

console.log(await refererSentTo(echo, { referrerPolicy: 'no-referrer' }));

// Full URL in Chromium; Firefox and WebKit send only the origin cross-site
console.log(await refererSentTo(echo, { referrerPolicy: 'unsafe-url' }));

On the test page it logged https://shop.example/, (none) and the full URL in Chromium 153, and https://shop.example/, (none) and https://shop.example/ in Firefox 155 and WebKit 26.6.

Good questions.

Is strict-origin-when-cross-origin an error?

No. It is the default Referrer-Policy since Chrome 85, Firefox 87 and Safari 15, and Chrome DevTools prints it for every request without its own policy, successful or not. It only controls the Referer header, so the reason a request failed is in the Console and the Network panel's Status column.

Does the default policy leak query strings to other sites?

Not through the Referer header. Cross-origin requests carry only the origin, such as https://shop.example/, and requests from HTTPS to HTTP carry nothing. Same-origin requests still send the full URL without the fragment, and Chromium 153 sends the full URL cross-site when a page opts into unsafe-url.

Why do I get RefererNotAllowedMapError with no-referrer?

With a no-referrer or same-origin policy the browser sends no Referer to Google, so a key restricted to your website has nothing to match. Google's Maps docs recommend referrerpolicy="strict-origin-when-cross-origin", which sends your base domain. Set it on the element or request that loads Maps instead of loosening the whole page.

Can I use a CORS proxy with a key restricted by HTTP referrer?

No. A proxy makes the request from its own server, browsers don't let JavaScript set Referer, and cors.dev forwards no Referer on the free tier or on Pro. Use the key from the page directly, or call the API from your own backend with a server key restricted by IP address.

Why does referrerPolicy unsafe-url only send the origin in Firefox and Safari?

MDN's compatibility data marks unsafe-url, no-referrer-when-downgrade and origin-when-cross-origin as removed in Firefox 92 and Safari 13. In the 28 October 2026 test, Firefox 155 and WebKit 26.6 sent only https://shop.example/ to a cross-site echo, and Firefox logged that it was ignoring the less restricted policy. Chromium 153 still sent the full URL.