You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PHP获取服务器目录中文件的正确绝对URL

问题描述

我用以下代码获取服务器文件夹路径:

print_r(str_replace("\\","/",dirname(__FILE__)));

返回结果示例(后续代码中$dir变量的值):

/nas/content/live/tcshop/wp-content/uploads/mvp-file-dir/audio/music/m034/

接着用PHP的DirectoryIterator读取该目录下的文件,代码如下:

$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
if($_SERVER['HTTP_HOST'] == "localhost"){
    define('SITE_URL', $protocol . $_SERVER['HTTP_HOST'] . '/');
    define('SITEPATH', $_SERVER['DOCUMENT_ROOT'] . '/');
}else{
     define('SITE_URL', $protocol . $_SERVER['HTTP_HOST']);
    define('SITEPATH', $_SERVER['DOCUMENT_ROOT']);
}
$dir = $_REQUEST['dir'];
$media = array();
$i = 0;
$di = new DirectoryIterator($dir);
    foreach ($di as $fileinfo) {
        $path_info = pathinfo($fileinfo->getPathname());
        if(isset($path_info['extension'])){
            if(in_array(strtolower($path_info['extension']), $type)){
                $fn = $fileinfo->getPathname();
                $media[] = array(
                     "SITE_URL" => SITE_URL,
                     "SITEPATH" => SITEPATH,
                     "fullpath" => SITE_URL.'/'.path2url(realpath($path_info['dirname'])).'/'.$path_info['basename'],
                     "basename" => $path_info['basename'],
                     "extension" => $path_info['extension'],
                    "dirname" => realpath($path_info['dirname']),
                    "filename" => $path_info['filename']
                );
                 $i++;
                  if($i==$limit) break;
            }
        }
    }
echo json_encode($media);
function path2url($dirname) {
    return str_replace(SITEPATH, '', str_replace('\\', '/', $dirname));
}

现在生成的文件完整绝对URL是:

https://some-domain.com/nas/content/live/tcshop/wp-content/uploads/mvp-file-dir/audio/music/m034/some-file.mp3

但实际正确的URL应该是:

https://some-domain.com/wp-content/uploads/mvp-file-dir/audio/music/m034/some-file.mp3

生成的URL包含多余路径段,导致无效,请问如何获取正确的绝对URL?

解决方案

问题核心是服务器路径到站点URL的映射逻辑错误,以下两种方法可以解决:

方法一:直接提取有效路径段

不需要依赖SITEPATH,直接从服务器路径中截取wp-content及之后的部分作为站点相对路径:

  1. 修改path2url函数:
function path2url($dirname) {
    $normalizedPath = str_replace('\\', '/', $dirname);
    // 定位wp-content的起始位置,截取后续部分
    $wpContentPos = strpos($normalizedPath, '/wp-content/');
    if ($wpContentPos !== false) {
        return substr($normalizedPath, $wpContentPos + 1); // 去掉开头的/,避免拼接时出现重复
    }
    return '';
}
  1. 调整fullpath的拼接逻辑(可选,避免URL出现重复斜杠):
"fullpath" => rtrim(SITE_URL, '/') . '/' . path2url(realpath($path_info['dirname'])) . '/' . $path_info['basename'],

方法二:修正站点根路径定义

如果$_SERVER['DOCUMENT_ROOT']没有正确指向站点的服务器根目录(即/nas/content/live/tcshop/),可以手动定义SITEPATH,让原有的替换逻辑生效:

// 替换成你的站点实际服务器根路径
define('SITEPATH', '/nas/content/live/tcshop/');

这样原path2url函数会自动把服务器根路径替换为空,剩下的就是站点根目录下的相对路径,拼上SITE_URL就能得到正确的绝对URL。

内容的提问来源于stack exchange,提问作者Toniq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:36:25