如何使用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及之后的部分作为站点相对路径:
- 修改
path2url函数:
function path2url($dirname) { $normalizedPath = str_replace('\\', '/', $dirname); // 定位wp-content的起始位置,截取后续部分 $wpContentPos = strpos($normalizedPath, '/wp-content/'); if ($wpContentPos !== false) { return substr($normalizedPath, $wpContentPos + 1); // 去掉开头的/,避免拼接时出现重复 } return ''; }
- 调整
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
相关产品推荐
相关产品推荐

