CSP 设置了 block-all-mixed-content 为啥 HTTPS 页面还是加载了 HTTP 资源?
我最近在项目里加了 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,结果都一样,图片照样加载……这到底怎么回事?
block-all-mixed-content 这个指令在 meta 标签里设置的话,浏览器根本不买账——Chrome 从 2015 年左右就开始忽略 meta 标签里的这个指令了,只有服务器响应头设置的才生效。
而且更坑的是,这个指令已经被标记为弃用,现代浏览器推荐用 upgrade-insecure-requests 代替。
你用服务器头设置还是不行的话,检查一下是不是有缓存,或者试试下面这个:
通过 .htaccess(Apache)设置:
或者同时加两个保险:
Nginx 的话:
设置完记得清浏览器缓存,然后强制刷新(Ctrl+Shift+R)。
如果你实在不想改服务器配置,meta 标签也不是完全没用,可以试试:
这个在大多数现代浏览器里 meta 标签是支持的,比 block-all-mixed-content 靠谱多了。
总结一下:block-all-mixed-content + meta 标签 = 没用,服务器响应头 + upgrade-insecure-requests = 稳。