如何通过Apache/PHP配置禁止PHP读取网站上级目录?
实现网站目录隔离:禁止PHP读取上级目录的两种方案
你可以通过Apache VirtualHost配置或PHP配置实现目录隔离,推荐用Apache配置,因为能针对单个站点生效,不影响其他网站。
一、通过Apache VirtualHost配置实现(推荐)
在你的VirtualHost的<Directory>块中添加php_admin_value指令,设置open_basedir限制PHP的文件访问范围:
修改后的完整配置如下:
<VirtualHost *:80> ServerName mysite.pl ServerAlias www.mysite DocumentRoot /var/www/public_html/mysite <Directory /var/www/public_html/mysite> Options Indexes FollowSymLinks AllowOverride All Require all granted # 限制PHP仅能访问当前站点目录和系统临时目录(按需调整) php_admin_value open_basedir "/var/www/public_html/mysite:/tmp" </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <IfModule mod_dir.c> DirectoryIndex index.php index.pl index.cgi index.html index.xhtml index.htm index.php5 </IfModule> </VirtualHost>
说明:
open_basedir指定PHP允许访问的目录列表,多个目录用冒号(Linux)分隔;/tmp是可选的,用于PHP处理临时文件(如上传、会话文件),如果不需要可以去掉;- 配置生效后,PHP尝试访问
../../public_html/another_site/这类上级目录时会直接报错,无法读取。
二、通过PHP配置实现
如果不想修改Apache配置,也可以通过以下方式设置:
- 站点根目录的.htaccess文件(需开启
AllowOverride All):
在/var/www/public_html/mysite/.htaccess中添加:
php_value open_basedir "/var/www/public_html/mysite:/tmp"
- PHP-FPM池配置(若使用PHP-FPM):
找到对应站点的FPM池配置文件(如/etc/php/8.2/fpm/pool.d/mysite.conf),添加:
php_admin_value[open_basedir] = "/var/www/public_html/mysite:/tmp"
- 全局php.ini配置(不推荐,会影响所有站点):
修改php.ini中的open_basedir参数:
open_basedir = "/var/www/public_html/mysite:/tmp"
注意:
- Apache配置中的
php_admin_value优先级最高,会覆盖PHP层面的设置; - 多站点环境下,全局php.ini设置会限制所有站点,灵活性差,不推荐。
内容的提问来源于stack exchange,提问作者Blazej Kita
相关产品推荐
相关产品推荐

