无需硬编码获取开发及生产环境下的网站根目录(含虚拟目录)
动态获取PHP网站根目录(无需硬编码虚拟目录)
这问题我做项目时也踩过坑,硬编码虚拟目录的话,切换开发/生产环境或者后续迁移站点简直是噩梦。给你写个完全动态的PHP函数,不管你的站点是在域名根目录还是虚拟目录下,都能精准返回作为相对路径起始点的网站根目录URL:
function getSiteRoot() { // 获取当前脚本的服务器路径和URL路径 $scriptFilename = $_SERVER['SCRIPT_FILENAME']; $scriptName = $_SERVER['SCRIPT_NAME']; // 计算脚本在文件系统中的相对位置(相对于网站根目录) $relativePath = str_replace($_SERVER['DOCUMENT_ROOT'], '', $scriptFilename); $relativePath = str_replace(DIRECTORY_SEPARATOR, '/', $relativePath); // 从脚本URL中移除相对路径,得到网站根目录的URL $siteRoot = str_replace($relativePath, '', $scriptName); // 拼接协议(http/https)和域名部分 $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https://' : 'http://'; $domain = $_SERVER['HTTP_HOST']; // 组合完整的根目录URL,确保结尾有斜杠 $fullRoot = rtrim($protocol . $domain . $siteRoot, '/') . '/'; return $fullRoot; }
函数工作原理:
- 利用
$_SERVER['DOCUMENT_ROOT'](网站根目录的文件系统路径)和$_SERVER['SCRIPT_FILENAME'](当前执行脚本的完整路径),算出脚本相对于根目录的位置 - 再结合
$_SERVER['SCRIPT_NAME'](当前脚本的URL路径),剥离掉脚本部分,得到根目录的URL路径 - 自动识别HTTP/HTTPS协议,拼接域名后返回完整的根目录URL,并且保证结尾带有斜杠(方便后续拼接相对路径)
测试场景验证:
- 开发环境(http://localhost/mygreatapp):调用
getSiteRoot()会返回http://localhost/mygreatapp/ - 当前生产环境(http://www.myawesomesite.com):返回
http://www.myawesomesite.com/ - 未来迁移后(http://www.myawesomesite.com/mygreatapp):自动返回
http://www.myawesomesite.com/mygreatapp/
使用的时候直接调用这个函数就行,完全不用修改任何硬编码内容,适配各种部署场景。
内容的提问来源于stack exchange,提问作者toddmo
相关产品推荐
相关产品推荐

