Skip to content
RU

ERR_BLOCKED_BY_RESPONSE: Which Header Blocked It and How to Fix

Laptop with a grey browser error page and network panel, one request row marked red

What it means: Chrome got the response, but its X-Frame-Options, CSP frame-ancestors, CORP or COEP header forbids this use.

  1. Read the DevTools console message first
  2. Open the blocked page in its own tab
  3. Embedding another site: ask its owner
  4. Owner: allow your origin in frame-ancestors
  5. Owner: send CORP on cross-origin resources

Test your URL now

Reads the response headers that block or allow loading: CSP, X-Frame-Options, CORP, HSTS.

Check your site's security →

What ERR_BLOCKED_BY_RESPONSE means

net::ERR_BLOCKED_BY_RESPONSE is Chromium error -27. Chromium defines it as a request that «failed because the response was delivered along with requirements which are not met (X-Frame-Options and Content-Security-Policy ancestor checks and Cross-Origin-Resource-Policy for instance)» (net_error_list.h). DNS, TCP, TLS and HTTP all succeeded: the response arrived over a working connection, and the browser then refused to use it because a header in that response forbids the way it was requested.

In practice the most common trigger is the first one, a page refusing to be put in an <iframe>, not the cross-origin-isolation family. It is not a certificate or HTTPS problem, not a CORS error (CORS failures are reported separately, as CORS errors in the console), and not a status-code problem.

Causes in Chrome, Edge, Firefox and Safari

BrowserWhat you seeMost common trigger
Chrome, EdgeInside the frame: «host is blocked» and «host refused to connect.»; in the console: net::ERR_BLOCKED_BY_RESPONSEThe framed page sends X-Frame-Options or CSP frame-ancestors that excludes your origin
Chrome, Edge (subresource)Image, script or font fails; Network panel shows it blocked with a reason such as NotSameOrigin or NotSameOriginAfterDefaultedToSameOriginByCoepCORP on the resource, or COEP require-corp on your page
FirefoxIts own blocked-frame page and a console message; no Chrome codeThe same headers
SafariAn empty frame and a console message in its own wordingThe same headers

Four mechanisms surface as the same network error, and the DevTools console message tells them apart. Read it before changing any header:

Blocked byConsole message containsFix on
X-Frame-Options«Refused to display … in a frame because it set X-Frame-Options»The framed site: drop the header or move to CSP
CSP frame-ancestors«Refused to frame … because an ancestor violates … frame-ancestors»The framed site: add your origin to the directive
Cross-Origin-Resource-Policya CORP entry in the Issues panel next to the failed requestThe resource server: set cross-origin
Cross-Origin-Embedder-Policythe embedding page sends require-corpEvery cross-origin subresource must opt in with CORP or CORS

Two of these you cannot fix from your own site: X-Frame-Options and frame-ancestors are set by the site you are trying to embed, and they are a deliberate refusal. There is no client-side flag that overrides them.

Behind Cloudflare, nginx or another proxy

These headers are often added by a layer you forgot about: a shared nginx snippet, a security-headers plugin, the application framework (Django's XFrameOptionsMiddleware sends DENY by default; WordPress sends X-Frame-Options: SAMEORIGIN on the login and admin screens), or a Cloudflare Transform Rule that modifies response headers. Find which layer adds the header before editing any of them. In nginx, hide the upstream's header and set the policy once for the path that must be embeddable:

location /embed/ {
    proxy_pass http://app;
    proxy_hide_header X-Frame-Options;
    add_header Content-Security-Policy "frame-ancestors 'self' https://partner.example.com" always;
}

# Public static files meant to be loaded by other sites
location /static/ {
    add_header Cross-Origin-Resource-Policy cross-origin always;
}

Remember that an add_header in a location block replaces all add_header directives inherited from the server level, so other security headers must be repeated there.

If you own the site

  1. See what the response actually sends.
    curl -sI https://example.com/embed/page | grep -iE 'x-frame-options|content-security-policy|cross-origin'
  2. Framing by a known partner: replace X-Frame-Options with CSP frame-ancestors listing the allowed origins. X-Frame-Options cannot list origins (the old ALLOW-FROM value is ignored by modern browsers), and when both headers are present, browsers that support frame-ancestors apply it instead of X-Frame-Options.
  3. Resources loaded by other sites: set Cross-Origin-Resource-Policy: cross-origin on them. same-site blocks requests from another registrable domain (eTLD+1), and same-origin blocks even your own subdomains.
  4. Cross-origin isolation (COOP + COEP): Cross-Origin-Opener-Policy: same-origin plus Cross-Origin-Embedder-Policy: require-corp is what unlocks SharedArrayBuffer, but every cross-origin subresource then needs CORP, or CORS via the crossorigin attribute and Access-Control-Allow-Origin. If you do not control those resources, use Cross-Origin-Embedder-Policy: credentialless, which loads no-cors resources without cookies instead of requiring CORP. Iframes on such a page must send COEP themselves.
  5. Do not add COEP to fix this error. require-corp is a cause of ERR_BLOCKED_BY_RESPONSE, not a cure; only set it if you need cross-origin isolation.

Background on the headers: configuring CSP headers.

If you are a visitor

This is not on your side. The site you are viewing tried to embed or load something whose owner forbids that use, and the browser enforced the owner's instruction. Your clock, antivirus, DNS or network do not cause it, and clearing the cache will not help unless the browser is reusing a stale copy of an old response.

What you can do: open the blocked page directly in its own tab (framing rules do not apply to a top-level page), and tell the owner of the embedding site which widget is broken. Do not install extensions that strip security headers to make a frame load; they remove clickjacking protection on every site.

How to confirm the fix

curl -sI https://example.com/embed/page | grep -i 'frame-ancestors'
# content-security-policy: frame-ancestors 'self' https://partner.example.com
curl -sI https://example.com/static/app.js | grep -i 'cross-origin-resource-policy'
# cross-origin-resource-policy: cross-origin

Then reload the embedding page with DevTools open and confirm the console no longer reports the block. To audit X-Frame-Options, CSP, CORP and the other response headers from outside, use the security headers checker.

Related errors

HeadersCSP, HSTS, X-Frame-Options, etc.
SSL/TLSEncryption and certificate
ConfigurationServer settings and leaks
Grade A-FOverall security score

Why teams trust us

OWASP
guidelines
15+
security headers
<2s
result
A–F
security grade

How it works

1

Enter site URL

2

Security headers analyzed

3

Get grade A–F

What Does the Security Analysis Check?

The tool checks HTTP security headers, SSL/TLS configuration, server info leaks, and protection against common attacks (XSS, clickjacking, MIME sniffing). A grade fromA to F shows overall security level.

Header Analysis

Checking Content-Security-Policy, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, and more.

SSL Check

TLS version, certificate expiry, chain of trust, HSTS support.

Leak Detection

Finding exposed server versions, debug modes, open configs, and directories.

Report with Recommendations

Detailed report explaining each issue with specific steps to fix it.

Who uses this

Security teams

HTTP header audit

DevOps

config verification

Developers

CSP & HSTS setup

Auditors

compliance checks

Common Mistakes

Missing Content-Security-PolicyCSP is the primary XSS defense. Without it, script injection is much easier.
Missing HSTS headerWithout HSTS, HTTPS-to-HTTP downgrade attacks are possible. Enable Strict-Transport-Security.
Server header exposes versionServer: Apache/2.4.52 helps attackers find exploits. Hide the version.
X-Frame-Options not setSite can be embedded in iframe for clickjacking. Set DENY or SAMEORIGIN.
Missing X-Content-Type-OptionsWithout nosniff, browsers may misinterpret file types (MIME sniffing).

Best Practices

Start with basic headersMinimum: HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy. Takes 5 minutes.
Implement CSP graduallyStart with Content-Security-Policy-Report-Only, monitor violations, then enforce.
Hide server headersRemove Server, X-Powered-By, X-AspNet-Version from responses.
Configure Permissions-PolicyRestrict camera, microphone, geolocation access — only what is actually used.
Check after every deploySecurity headers can be overwritten during server configuration updates.

Get more with a free account

Security check history and HTTP security header monitoring.

Sign up free

Learn more

Sources

Frequently Asked Questions

I get it when embedding another site in an iframe. How do I bypass it?

You do not. X-Frame-Options and CSP frame-ancestors are the target site refusing to be framed, enforced by the browser on their instruction. The only real routes are an agreement with that site to allow your origin, an API or oEmbed endpoint they publish, or server-side proxying with their permission.

Is ERR_BLOCKED_BY_RESPONSE an SSL problem? Does it block HTTPS?

No. Chromium error -27 is decided after a response has already been delivered over a working connection, so TLS is not in the path. The request is rejected because a requirement carried by that response was not met.

Why does the page open fine in its own tab but not in my iframe?

X-Frame-Options and frame-ancestors only restrict embedding. A top-level visit is allowed, so the page works directly and fails only inside the frame.

What is cross-origin isolation and why does it cause this error?

It is a mode enabled by COOP same-origin plus COEP require-corp or credentialless, required for SharedArrayBuffer and high-precision timers. Under require-corp, any cross-origin resource without CORP or CORS is blocked with this error.

How do I tell which header blocked the request?

Open DevTools and read the console. "Refused to display ... because it set X-Frame-Options" and "violates ... frame-ancestors" name the framing headers; a CORP block appears in the Issues panel next to the failed request.

Try the live tool that powered this guide

Free plan — 10 monitors, checks every 5 min, no card required. Upgrade for 1-minute interval and multi-region monitoring.