PHP中的SERVER全局变量中如何准确获取实际请求的文件名?
由一个动态引入想到的
事情起因是我想要做一个动态的引入。
// 使用 SCRIPT_FILENAME 获取当前执行的文件名,更可靠
$requestFilename = basename($_SERVER['REQUEST_URI']);
$requireVolcFiles = [
'get-image-result.php',
'submit-image-task.php'
];
if (in_array($requestFilename, $requireVolcFiles)) {
require_once(__DIR__ . '/libs/volcJimeiAI.class.php');
}
require_once(__DIR__ . '/libs/UserManager.class.php');
header("content-type:application/json;charset=utf-8");这里我想针对某些特定的文件,引入单独的类。这里我使用的是$_SERVER['REQUEST_URI'],但是经过查询发现一个严重问题:
basename($_SERVER['REQUEST_URI'])能准确获取文件名吗?
答案是:不一定,这取决于你的服务器配置。
情况一:URL 重写(如 Apache 的 mod_rewrite 或 Nginx)如果你的网站使用了 URL 重写(例如,将
/user/123这样的美化 URL 指向index.php),那么$_SERVER['REQUEST_URI']的值会是/user/123,而basename()的结果会是123,这显然不是你想要的。在这种情况下,你的代码会失效。情况二:直接访问 PHP 文件如果你的 URL 是直接指向 PHP 文件的,例如
http://example.com/get-image-result.php?param=1,那么$_SERVER['REQUEST_URI']的值是/get-image-result.php?param=1,basename()函数会正确地返回get-image-result.php。
更可靠的方法:使用$_SERVER['SCRIPT_FILENAME']$_SERVER['SCRIPT_FILENAME']会返回当前正在执行的脚本的绝对路径,例如/var/www/html/get-image-result.php。无论是否开启 URL 重写,它都能准确指向正在运行的文件。配合basename()使用,是获取当前脚本文件名的最佳实践。
最终修改如下:
// 使用 SCRIPT_FILENAME 获取当前执行的文件名,更可靠
$requestFilename = basename($_SERVER['SCRIPT_FILENAME']);
$requireVolcFiles = [
'get-image-result.php',
'submit-image-task.php'
];
if (in_array($requestFilename, $requireVolcFiles)) {
require_once(__DIR__ . '/libs/volcJimeiAI.class.php');
}
require_once(__DIR__ . '/libs/UserManager.class.php');
header("content-type:application/json;charset=utf-8");
目录