在虚拟主机中配置 Permissions-Policy 需启用 mod_headers 模块、使用正确语法并置于 VirtualHost 内,替代已废弃的 Feature-Policy;通过 Header always set 指令设置逗号分隔的权限策略,确保所有响应状态生效,并验证头信息是否实际送达。
在虚拟主机中配置 mod_headers 设置 permissions-policy,核心是启用模块、写对语法、放对位置,并避开已废弃的 feature-policy。它不依赖 php 或前端代码,而是由 apache 在响应前统一注入头信息,稳定且不易被覆盖。
确认 mod_headers 已启用
该模块必须激活,否则所有 Header 指令静默失效:
- Debian/Ubuntu 系统:运行
sudo a2enmod headers,再执行sudo systemctl restart apache2 - RHEL/CentOS 系统:检查
/etc/httpd/conf/httpd.conf中是否存在未注释的LoadModule headers_module modules/mod_headers.so,然后重启httpd - 验证是否生效:执行
apache2ctl -M | grep headers(或httpd -M | grep headers),看到headers_module (shared)即表示加载成功
使用 Permissions-Policy 替代 Feature-Policy
Feature-Policy 已被 Chrome 93+、Firefox 97+ 等主流浏览器完全弃用,继续使用将被忽略。必须改用 Permissions-Policy,注意三点差异:
- 头名称为
Permissions-Policy(大小写敏感,含连字符) - 值格式为逗号分隔的指令列表,如
geolocation=(), camera=(), microphone=();括号内留空表示禁止,填self或具体域名表示允许 - 未声明的权限默认允许——不能靠“不写就禁用”,必须显式列出要限制的功能
在虚拟主机配置中添加策略
推荐将规则写入站点专属的虚拟主机文件(如 /etc/apache2/sites-available/your-site.conf),避免影响其他站点:
<IfModule mod_headers.c>
Header always set Permissions-Policy "geolocation=(), camera=(), microphone=(), accelerometer=(), usb=()"
</IfModule>
说明:
-
always确保策略作用于所有响应状态(包括 404、500、304),比set更可靠 - 放在
<VirtualHost>块内,而非全局httpd.conf,便于按站点差异化控制 - 若需对子路径(如
/admin)加强限制,应额外用<Location "/admin">包裹更严格的策略
验证与常见问题
部署后务必实测:
- 打开浏览器开发者工具 → Network → 刷新页面 → 查看任意响应的 Response Headers,确认存在
Permissions-Policy且值正确 - 访问 securityheaders.com 输入域名,可快速检测该头是否送达
- 若策略未生效,检查是否被 CDN(如 Cloudflare)过滤——部分 CDN 默认剥离或覆盖自定义头,需在其控制台单独开启或配置响应头
- 注意 Apache 配置中后出现的同名
Header指令会覆盖前面的,确保没有冲突定义


















