PHP中file_exists()使用绝对路径失效问题求助
问题与解决方向
文件结构
- core - ajax.php - images - image.jpg class.php
问题详情
ajax.php引入class.php的操作正常,但在class.php中执行以下代码时,file_exists()返回false:
$path = '/images/image.jpg'; file_exists($path);
只有将路径修改为../images/image.jpg,file_exists()才会返回预期的true。
原本以为以斜杠开头的路径会从网站顶层目录搜索,但实际工作目录为/core。尝试用dirname(__FILE__)拼接路径:
$path = dirname(__FILE__).'/images/image.jpg';
得到的路径为/Websites/PG/core/images/image.jpg,依然无法找到目标图片。
服务器根目录的.htaccess配置如下:
RewriteEngine On RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com$ [NC] RewriteCond %{REQUEST_FILENAME} !/Websites/PG/ RewriteRule ^(.*)$ /Websites/PG/$1 [L]
怀疑该Rewrite规则是问题根源,因为其他网站使用相同逻辑未出现异常。
解决方向
1. 区分PHP文件系统路径与URL路径
以斜杠开头的路径在PHP中指向服务器文件系统的根目录,而非网站的文档根目录。你的网站文件实际存储在/Websites/PG/,所以/images/image.jpg会去服务器根目录查找,自然不存在,这是核心问题。
2. 正确拼接网站根目录路径
直接基于class.php的位置获取网站根目录(class.php所在目录即为网站根目录):
// 获取网站根目录的绝对路径 $site_root = dirname(__FILE__); // 拼接图片路径 $image_path = $site_root . '/images/image.jpg'; // 验证文件是否存在 var_dump(file_exists($image_path));
也可以定义全局常量方便后续使用:
// 在class.php或入口文件开头定义 define('SITE_ROOT', realpath(dirname(__FILE__))); // 后续调用 $image_path = SITE_ROOT . '/images/image.jpg';
3. 验证路径解析结果
使用realpath()函数查看路径的实际解析结果,确认是否与服务器上的真实文件路径一致:
$path = dirname(__FILE__) . '/images/image.jpg'; echo realpath($path);
4. 排查.htaccess规则的间接影响
当前Rewrite规则仅影响HTTP请求的路由,不会直接改变PHP的文件系统操作路径,但可以检查%{REQUEST_FILENAME}的判断是否正确,避免规则导致的请求路径异常间接影响文件操作。
内容的提问来源于stack exchange,提问作者Moseleyi
相关产品推荐
相关产品推荐

