虚拟目录下PHP include('includes/countries.php')加载失败求助
这个问题我太熟悉了——虚拟目录(伪目录)下的PHP文件路径坑,核心原因是PHP的当前工作目录和你直观以为的URL路径不匹配,尤其是当虚拟目录是通过重写规则(比如Apache mod_rewrite、Nginx rewrite)映射到真实目录时,相对路径很容易失效。
你尝试的./includes/countries.php没用,是因为./对应的是PHP当前的工作目录(可以用echo getcwd();打印出来看看),而虚拟URL/list/small/对应的真实执行脚本可能还是/list/index.php,但服务器的工作目录并没有切换到/list/small/(因为这个目录根本不存在),所以相对路径自然找不到文件。
给你几个可靠的解决方案,按优先级排序:
用魔术常量拼接绝对路径(最推荐)
直接基于当前脚本的真实目录来构建路径,不管URL怎么变都不会错:include(__DIR__ . '/includes/countries.php');这里的
__DIR__是PHP内置的魔术常量,会返回当前执行脚本所在的真实绝对目录。如果你的PHP版本低于5.3(现在几乎没人用了),可以用dirname(__FILE__)代替__DIR__。设置全局include路径
如果你有很多文件需要引用includes目录下的文件,可以在项目入口脚本(比如index.php)开头设置include路径:// 把includes目录添加到全局包含路径 set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__ . '/includes'); // 之后直接引用文件名即可 include('countries.php');这种方法适合大型项目统一管理依赖文件。
验证当前工作目录(排查用)
要是你想搞明白问题到底出在哪,在有问题的页面里加一行代码:echo "当前工作目录:" . getcwd();打印出来的路径大概率是真实的
/list/,而不是虚拟的/list/small/,这就是为什么相对路径找不到文件的原因。
内容的提问来源于stack exchange,提问作者Smith

