Apache中启用Permissions-Policy需通过mod_headers模块在响应头中设置,作用于主页面及所有iframe,禁用指定API应使用(),iframe的allow属性无法覆盖全局禁止策略。

在 Apache 中启用 Permissions-Policy,核心是通过 mod_headers 模块在 HTTP 响应头中注入 Permissions-Policy 字段。这不是前端 JS 控制,而是服务端强制策略,对主页面及内嵌的 iframe 均生效。
确认并启用 mod_headers 模块
多数现代 Apache 安装默认已启用该模块,但需确认:
- 运行
a2enmod headers(Debian/Ubuntu)或检查httpd.conf中是否含LoadModule headers_module modules/mod_headers.so - 若被注释,取消注释;保存后执行
systemctl restart apache2或apachectl restart
在虚拟主机或目录配置中添加策略头
推荐在 或 块内设置,避免全局误配:
<ifmodule mod_headers.c> Header always set Permissions-Policy "geolocation=(), camera=(), microphone=(), notifications=(), payment=()" </ifmodule>
说明:
-
always表示无论响应状态码(200/404/500)都发送该头,确保策略不被绕过 - 括号
()表示“完全禁止”,即该 API 对当前源及其所有 iframe 均不可用 - 如需允许主域名但禁用第三方 iframe,可写为
camera=(self);允许多个源则用camera=(self "https://trusted.example.com")
针对 iframe 的精细化控制(allow 属性补充)
HTTP 头作用于整个页面上下文,而 的 allow 属性可单独覆盖子框架行为:
<iframe src="https://thirdparty.com/widget" allow="geolocation; encrypted-media"></iframe>
注意:
- 此属性仅影响该 iframe 内容,不改变主页面策略
- 它不能“开启”被 HTTP 头全局禁止的功能(例如主策略设了
geolocation=(),iframe 的allow无效) - 适合在引入可信第三方组件时按需放行,而非放松整体策略
验证与调试建议
部署后务必验证策略是否生效:
- 用浏览器开发者工具 → Network → 任意 HTML 请求 → Headers 标签页,查找
Permissions-Policy响应头 - 在控制台运行
navigator.permissions.query({name:'geolocation'}),返回state: "denied"表示策略起效 - 避免过度宽松:生产环境慎用
*或未加限制的(*),优先采用()或(self)











