Nginx中配置Permissions-Policy需用add_header指令注入响应头,推荐通过map按Content-Type动态匹配策略,如对HTML/JS/PDF启用严格限制,避免影响静态资源,并用always确保所有响应携带该头。

在 Nginx 中配置 Permissions-Policy,核心是通过 add_header 指令在 HTTP 响应头中注入策略。它不是靠 location 或 if 判断动态控制,而是基于内容类型或全局统一声明,推荐用 map 实现条件化策略(比如只对 HTML/JS/PDF 等敏感类型生效)。
基础写法:全局静态策略
最简单的方式是在 server 或 http 块中直接添加固定策略:
add_header Permissions-Policy "geolocation=(), camera=(), microphone=(), payment=()";- 这表示禁止所有页面使用地理位置、摄像头、麦克风和支付 API
- 适用于纯展示型站点,或明确不需要这些功能的后台系统
进阶写法:按 Content-Type 动态匹配
更合理的方式是只对可执行内容(如 HTML、JS、PDF)启用严格策略,避免误影响图片、字体等静态资源:
- 先在
http块顶部定义 map:
~*text/(html|javascript)|application/pdf|xml "accelerometer=(),autoplay=(),browsing-topics=(),camera=(),display-capture=(),document-domain=(),encrypted-media=(),fullscreen=(),geolocation=(),gyroscope=(),magnetometer=(),microphone=(),midi=(),payment=(),picture-in-picture=(),publickey-credentials-get=(),screen-wake-lock=(),sync-xhr=(self),usb=(),web-share=(),xr-spatial-tracking=()";
default "";
}
- 再在 server 或 location 中引用:
add_header Permissions-Policy $permissions_policy always;-
always参数确保即使返回 304 或错误码也携带该头
常见策略组合建议
根据实际场景选择收紧程度,避免一刀切导致功能异常:
- 禁用自动播放且只允许同源同步 XHR:
autoplay=(), sync-xhr=(self) - 允许自身使用地理位置,但禁止第三方 iframe:
geolocation=(self) - 彻底关闭卸载事件(防止滥用 unload):
unload=() - 禁用跨域 iframe 的传感器访问:
accelerometer=(), gyroscope=(), magnetometer=()
验证与调试要点
配置后务必验证是否生效,并关注控制台警告:
- 用
curl -I https://yoursite.com检查响应头是否含Permissions-Policy - 打开 Chrome DevTools → Network → 查看任意 HTML 请求的 Response Headers
- 若看到
[Violation] Permissions Policy violation,说明某脚本尝试调用被禁 API,需检查策略是否过严或代码是否需适配 - 注意:部分策略(如
sync-xhr)会影响旧逻辑,上线前应在测试环境完整回归


















