apache中通过mod_headers配置permissions-policy需启用模块、在主配置/vhost顶层使用header always set指令,按需设定功能开关,并与csp协同;禁用高风险功能如camera=()是推荐起点。

在 Apache 中通过 mod_headers 配置 Permissions-Policy(原 Feature-Policy),核心是使用 Header always set 指令明确声明哪些浏览器功能可被页面使用,从而限制潜在风险行为(如自动播放、地理位置获取、摄像头调用等)。
确认 mod_headers 已启用并支持 Permissions-Policy
该头自 HTTP/2 起广泛支持,Apache 2.4.32+ 原生兼容。需确保:
-
mod_headers已加载:检查httpd.conf或运行a2enmod headers(Debian/Ubuntu)或确认存在LoadModule headers_module modules/mod_headers.so - 不依赖
.htaccess:Permissions-Policy 必须在主配置或虚拟主机顶层设置,否则可能不生效或被覆盖
基础语法与常用策略示例
格式为:Header always set Permissions-Policy "feature=(), feature2=(origin), ..."。括号内指定允许的来源,() 表示完全禁用,(self) 表示仅同源,(*) 表示全允许(不推荐)。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 禁用高风险功能(推荐起点):
Header always set Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()" - 允许同源使用图片捕获:
Header always set Permissions-Policy "camera=(self); microphone=(self)" - 允许嵌入式内容使用地理位置(谨慎):
Header always set Permissions-Policy "geolocation=(self \"https://maps.example.com\")"
按路径或类型条件化设置(避免误禁)
不要全局一刀切。例如,管理后台可能需要 screen-wake-lock,而静态博客页应禁用;API 接口响应(application/json)无需该头,HTML 页面才需要。
- 仅对 HTML 响应设置:
<filesmatch><br> Header always set Permissions-Policy "geolocation=(), camera=()"<br></filesmatch>
- 在虚拟主机中排除特定路径:
<location><br> Header always set Permissions-Policy "screen-wake-lock=(self)"<br></location>
与其他安全头协同及注意事项
Permissions-Policy 与 CSP 中的 frame-ancestors、script-src 等配合更有效,但要注意:
- 它不替代 CSP,而是补充——CSP 控制资源加载,Permissions-Policy 控制 API 调用
- 若同时配置了旧版
Feature-Policy,建议移除,因现代浏览器以Permissions-Policy为准 - 设置后用 Chrome DevTools → Application → Permissions Policy 验证是否生效,或访问 securityheaders.com 扫描










