You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一服务器不同域名目录下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测试:
    setenforce 0
    
    之后重新访问domainB的file.php,如果问题解决,说明是SELinux的问题。可以通过添加规则永久允许访问:
    semanage 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 19:27:11