同一服务器不同域名目录下PHP执行file_exists、include等操作失败求助
排查与解决跨域名目录文件访问失败的问题
针对同一服务器、同一用户下,domainB无法访问domainA目录文件的问题,给出以下排查方向和解决方案:
1. 检查目录与文件的权限设置
即使两个站点归属同一用户,目录的权限位可能限制了跨目录访问:
- 确保
/var/hostdata/username/public_html/domain_a/目录权限为755,执行命令:chmod 755 /var/hostdata/username/public_html/domain_a/ - 确保目标文件(
include.php、sitemap.xml)权限为644:chmod 644 /var/hostdata/username/public_html/domain_a/include.php /var/hostdata/username/public_html/domain_a/sitemap.xml - 同时检查上层目录(比如
public_html、username)的权限,确保它们的执行权限(x位)对当前用户开放,否则会导致目录无法被遍历。
2. 排查SELinux限制
很多Linux服务器默认启用SELinux,它会在文件系统层面强制访问控制,即使权限正确也会拦截跨目录访问:
- 临时关闭SELinux测试:
之后重新访问domainB的file.php,如果问题解决,说明是SELinux的问题。可以通过添加规则永久允许访问:setenforce 0semanage fcontext -a -t httpd_sys_rw_content_t "/var/hostdata/username/public_html/domain_a(/.*)?" restorecon -Rv /var/hostdata/username/public_html/domain_a/
3. 确认PHP配置是否生效
你已经在vhost设置了php_admin_value open_basedir none,但需要确认配置是否真正生效:
- 在domainB的file.php中添加代码,输出当前open_basedir配置:
如果输出不是echo ini_get('open_basedir');none,说明vhost的配置没生效:- 若使用Apache,需重启Apache服务;
- 若使用Nginx+PHP-FPM,需重启PHP-FPM服务,并确认vhost配置正确传递给了FPM池。
4. 检查PHP其他安全配置
- 查看
php.ini中是否有disable_functions配置,确认file_exists、file_get_contents、include没有被禁用; - 若服务器使用了PHP安全模式(仅PHP5.4及以下版本存在),检查
safe_mode是否开启,开启会限制跨目录文件操作,需设置safe_mode = Off。
5. 验证include的实际执行情况
当前的include代码没有错误提示,可以开启错误输出排查:
error_reporting(E_ALL); ini_set('display_errors', 1); include('/var/hostdata/username/public_html/domain_a/include.php');
如果include的文件本身没有输出内容,即使包含成功也不会有显示,可以在include.php中添加测试内容(比如echo 'included';)来验证。
内容的提问来源于stack exchange,提问作者Phong Thai
相关产品推荐
相关产品推荐

