CSP 设置了 block-all-mixed-content 为啥 HTTPS 页面还是加载了 HTTP 资源?

ლ浩迪 阅读 12

我最近在项目里加了 CSP 头,设置了 Content-Security-Policy: block-all-mixed-content,但奇怪的是,页面在 HTTPS 下居然还能加载一个 HTTP 的图片资源,浏览器也没报错。不是说这个指令会自动阻止所有混合内容吗?是不是我哪里理解错了?

我的 HTML 里确实引用了一个 http:// 的图片,代码如下:

<img src="http://example.com/image.jpg" alt="test">
<meta http-equiv="Content-Security-Policy" content="block-all-mixed-content">

试过把 meta 标签放 head 里、也试过用服务器响应头设置 CSP,结果都一样,图片照样加载……这到底怎么回事?

我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
皇甫华丽
这个问题挺经典的,你踩到坑了。

block-all-mixed-content 这个指令在 meta 标签里设置的话,浏览器根本不买账——Chrome 从 2015 年左右就开始忽略 meta 标签里的这个指令了,只有服务器响应头设置的才生效。

而且更坑的是,这个指令已经被标记为弃用,现代浏览器推荐用 upgrade-insecure-requests 代替。

你用服务器头设置还是不行的话,检查一下是不是有缓存,或者试试下面这个:

通过 .htaccess(Apache)设置:

Header set Content-Security-Policy "upgrade-insecure-requests"


或者同时加两个保险:

Header set Content-Security-Policy "upgrade-insecure-requests; block-all-mixed-content"


Nginx 的话:

add_header Content-Security-Policy "upgrade-insecure-requests" always;


设置完记得清浏览器缓存,然后强制刷新(Ctrl+Shift+R)。

如果你实在不想改服务器配置,meta 标签也不是完全没用,可以试试:

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">


这个在大多数现代浏览器里 meta 标签是支持的,比 block-all-mixed-content 靠谱多了。

总结一下:block-all-mixed-content + meta 标签 = 没用,服务器响应头 + upgrade-insecure-requests = 稳。
点赞
2026-03-11 13:10