线上部署后PHP file_exists()函数无法定位部分文件的问题排查求助
解决线上部署后file_exists()异常与逻辑分支错误问题
看起来你遇到的问题主要来自两个方面:逻辑判断的错误和Linux系统的文件名大小写敏感特性,咱们一步步拆解解决:
1. 先修复你的临时方案中的逻辑异常
你添加的第二个elseif分支只判断了Forall_Posts.php是否存在,而没有绑定当前的$page值。因为这个文件本身确实存在,所以只要第一个if条件不满足(比如找不到A.php),程序就会直接进入这个分支——这就是为什么访问A.php时会加载Forall_Posts.php的核心原因。
修正这个分支的判断逻辑,必须同时匹配$page值和文件存在性:
if (file_exists(__DIR__ . "/pages/{$page}.php")) { debug_to_console("First if condition"); include __DIR__ . "/pages/{$page}.php"; } elseif ($page === 'Forall_Posts' && file_exists(__DIR__ . "/pages/Forall_Posts.php")) { debug_to_console("Second if condition"); include __DIR__ . "/pages/Forall_Posts.php"; } elseif (file_exists(__DIR__ . "/techPosts/{$page}.php")) { include __DIR__ . "/techPosts/{$page}.php"; } else { include __DIR__ . '/pages/404.php'; }
这样只有当$page确实等于Forall_Posts时,才会触发这个分支,其他不存在的页面会正常进入404流程。
2. 解决file_exists()找不到部分文件的核心问题
本地XAMPP(Windows环境)是大小写不敏感的,比如file_exists("./pages/forall_posts.php")和file_exists("./pages/Forall_Posts.php")都会返回true;但线上主机几乎都是Linux系统,文件名大小写严格区分,只要大小写不匹配,就会返回false。
这就是为什么你把默认值改成Forall_Posts能正常加载,但其他情况找不到文件的原因:
- 检查你的
$_GET['p']参数的大小写是否和服务器上的文件名完全一致:比如访问A.php时,参数应该是?p=A而不是?p=a;访问Forall_Posts.php时,参数必须是?p=Forall_Posts(和文件名大小写完全对齐)。 - 建议统一你的文件名和参数规则:比如全部改成小写(比如
forall_posts.php,参数用?p=forall_posts),或者统一使用驼峰式,从根源避免大小写混乱。
3. 额外调试建议
如果还是有问题,可以在代码中输出实际要检查的文件路径,方便精准排查:
// 在判断前添加调试输出(线上可输出到日志或控制台) $pagePath = __DIR__ . "/pages/{$page}.php"; echo "Checking target file: {$pagePath}"; if (file_exists($pagePath)) { // ... 后续逻辑 }
同时检查服务器上的文件权限,确保web服务器用户(比如www-data)拥有读取pages和techPosts目录下文件的权限。
内容的提问来源于stack exchange,提问作者Mahfouz
相关产品推荐
相关产品推荐

