
What it means: Chrome got the response, but its X-Frame-Options, CSP frame-ancestors, CORP or COEP header forbids this use.
frame-ancestorsFree online tool — website security scanner: instant results, no signup.
Reads the response headers that block or allow loading: CSP, X-Frame-Options, CORP, HSTS.
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.
| Browser | What you see | Most common trigger |
|---|---|---|
| Chrome, Edge | Inside the frame: «host is blocked» and «host refused to connect.»; in the console: net::ERR_BLOCKED_BY_RESPONSE | The 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 NotSameOriginAfterDefaultedToSameOriginByCoep | CORP on the resource, or COEP require-corp on your page |
| Firefox | Its own blocked-frame page and a console message; no Chrome code | The same headers |
| Safari | An empty frame and a console message in its own wording | The 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 by | Console message contains | Fix 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-Policy | a CORP entry in the Issues panel next to the failed request | The resource server: set cross-origin |
Cross-Origin-Embedder-Policy | the embedding page sends require-corp | Every 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.
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.
curl -sI https://example.com/embed/page | grep -iE 'x-frame-options|content-security-policy|cross-origin'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.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.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.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.
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.
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-originThen 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.
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.
Checking Content-Security-Policy, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, and more.
TLS version, certificate expiry, chain of trust, HSTS support.
Finding exposed server versions, debug modes, open configs, and directories.
Detailed report explaining each issue with specific steps to fix it.
HTTP header audit
config verification
CSP & HSTS setup
compliance checks
Strict-Transport-Security.Server: Apache/2.4.52 helps attackers find exploits. Hide the version.DENY or SAMEORIGIN.nosniff, browsers may misinterpret file types (MIME sniffing).Content-Security-Policy-Report-Only, monitor violations, then enforce.Server, X-Powered-By, X-AspNet-Version from responses.Security check history and HTTP security header monitoring.
Sign up freeYou 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.
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.
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.
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.
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.
Free plan — 10 monitors, checks every 5 min, no card required. Upgrade for 1-minute interval and multi-region monitoring.