PHP 8.0+ 必须在 .user.ini 中严格配置 open_basedir,路径末尾带/、英文冒号分隔、无空格;Nginx 需在 fastcgi_param 中二次传递 PHP_VALUE;测试脚本输出须含对应路径才生效。

直接在虚拟目录对应站点根目录下编辑 .user.ini,追加别名路径到 open_basedir 值里,并确保每段路径以 / 结尾、用英文冒号分隔、中间无空格——这是 PHP 8.0+ 环境下防止路径穿越和越权访问的强制要求。
路径必须带末尾斜杠
例如虚拟目录映射到 /var/www/api/,则 open_basedir 中必须写成:
/var/www/example.com/:/var/www/api/:/tmp/:/proc/
写成 /var/www/api(缺斜杠)会导致前缀匹配绕过,攻击者可构造 /var/www/api_evil/ 成功突破白名单。
多路径严格格式规范
.user.ini 中的 open_basedir 值需满足三项硬性规则:
立即学习“PHP免费学习笔记(深入)”;
- 各路径之间用英文冒号
:连接,不能有空格或中文 - 每个路径末尾必须有
/(包括/tmp/、/proc/) - 若该文件被
chattr +i锁定,需先执行chattr -i .user.ini解锁再修改
Nginx + PHP-FPM 需二次加固
仅改 .user.ini 不够,Nginx 的 server 块中还必须显式传递:
- 在
include fastcgi.conf;之后添加:fastcgi_param PHP_VALUE "open_basedir=/var/www/example.com/:/var/www/api/:/tmp/:/proc/"; - 否则 PHP-FPM 可能忽略
.user.ini设置,尤其在多池或多用户场景下
验证是否真正生效
在虚拟目录下放一个测试脚本(如 /var/www/api/test.php),内容为:
<?php echo ini_get('open_basedir'); ?>
通过浏览器访问 /api/test.php,输出必须包含 /var/www/api/ 才算配置成功。若为空或不包含该路径,说明未加载或被更高优先级配置覆盖。



















