子域名PHP文件如何包含根目录_private下的脚本文件?
问题核心
你的测试输出已经给出了关键线索:你拼接路径时少了一个斜杠,导致生成的路径完全错误。看你写的代码:
include_once(dirname(__DIR__, 1)."_private/scripts.php");
dirname(__DIR__, 1)返回的是/homepages/htdocs/michelpage,直接拼接_private会变成/homepages/htdocs/michelpage_private/scripts.php,自然找不到目标文件。
可行解决方案
方案1:修正路径拼接(最直接)
在_private前加上斜杠,确保路径层级正确:
$privateScript = dirname(__DIR__, 1) . "/_private/scripts.php"; include_once($privateScript);
或者更简洁的写法,利用__DIR__向上跳一级后直接拼接目标路径:
include_once(__DIR__ . "/../_private/scripts.php");
你之前试过INCLUDE "../_private/scripts.php"如果没生效,可能是当前PHP文件的执行目录并非子域名目录,可以先打印getcwd()确认执行目录,再调整相对路径的层级。
方案2:利用DOCUMENT_ROOT调整路径
你提到$_SERVER['DOCUMENT_ROOT']是/htdocs/michelpage/roadtrips,说明每个子域名的Web根目录被配置为各自的子目录。要拿到主站根目录,只需从DOCUMENT_ROOT向上跳一级:
$rootDir = dirname($_SERVER['DOCUMENT_ROOT'], 1); include_once($rootDir . "/_private/scripts.php");
方案3:设置全局include_path(一劳永逸)
如果有18个子域名需要共用这个私有脚本,建议直接把_private目录加入PHP的include路径,后续无需再写长路径:
- 若有权限修改php.ini,添加:
include_path = ".:/homepages/htdocs/michelpage/_private" - 若只能用.htaccess,在子域名目录的.htaccess文件中添加:
php_value include_path ".:/homepages/htdocs/michelpage/_private"
设置完成后,直接用文件名包含即可:
include_once("scripts.php");
关于DOCUMENT_ROOT和__DIR__差异的说明
$_SERVER['DOCUMENT_ROOT']是Web服务器配置的网站访问根目录,你的主机商给每个子域名单独配置了这个路径,指向对应的子目录;而__DIR__是当前PHP文件在服务器上的真实物理路径,两者的差异是主机配置导致的,不用纠结,以__DIR__返回的物理路径为准即可。
内容的提问来源于stack exchange,提问作者sdm1177

