如何强制PHP FPM仅读取DOCUMENT_ROOT目录下的.user.ini文件?
强制PHP FPM仅读取DOCUMENT_ROOT目录下的.user.ini文件
核心思路
PHP FPM默认会从脚本所在目录向上扫描至DOCUMENT_ROOT读取所有.user.ini文件,目前没有直接的配置项禁用这一扫描行为,但可以通过以下两种可靠方式实现需求:
方法1:通过PHP FPM配置锁定并按需启用.user.ini
在你的PHP FPM池配置文件(如/etc/php/{version}/fpm/pool.d/www.conf)中添加以下配置:
- 全局禁用所有
.user.ini文件的读取:
php_admin_value[user_ini.filename] = ""
- 针对DOCUMENT_ROOT路径单独启用
.user.ini:
[PATH=/] php_value[user_ini.filename] = ".user.ini"
注意:这种路径匹配规则仅支持PHP 7.4及以上版本的FPM,需确认你的PHP版本符合要求。配置生效后,只有DOCUMENT_ROOT(即
/路径对应的目录)下的.user.ini会被读取,子目录的同名文件会被完全忽略。
方法2:通过文件权限限制子目录.user.ini的可读性
利用Linux权限机制,让PHP运行进程(通常为www-data用户)无法读取子目录下的.user.ini:
- 直接设置子目录
.user.ini为完全不可读:
chmod 000 root/other/.user.ini root/other/another/.user.ini
- 或者修改文件归属为root用户并限制权限:
chown root:root root/other/.user.ini root/other/another/.user.ini chmod 600 root/other/.user.ini root/other/another/.user.ini
这种方式无需修改PHP配置,即使FPM扫描到这些文件,也因权限不足无法读取内容,达到忽略的效果。
额外安全加固
完成上述配置后,记得给DOCUMENT_ROOT下的.user.ini设置不可变标志,防止被篡改:
chattr +i root/.user.ini
内容的提问来源于stack exchange,提问作者NetVicious
相关产品推荐
相关产品推荐

