PHP开发中解决跨目录文件引用问题的动态路径方案咨询
解决方案
当前实现的函数问题说明
你写的get_file_dir依赖全局变量$argv,该变量仅在CLI命令行模式下可用,普通Web请求场景下不存在该变量,会直接抛出未定义警告,无法正常使用。
服务端跨层级引入公共文件最优方案
核心思路是提前定义固定的项目根目录绝对路径常量,所有公共文件引入都基于该常量拼接,不需要手动调整层级:
- 在项目的Web根目录(即你结构中的
website目录)新建全局配置文件config.php,写入以下代码:
<?php // 定义项目Web根目录的绝对路径,__DIR__固定为当前config.php所在的website目录 define('WEB_ROOT', __DIR__ . DIRECTORY_SEPARATOR);
- 所有业务页面首次仅需按自身所在层级引入一次
config.php即可:website/index.php引入写法:include './config.php';website/404/index.php引入写法:include '../config.php';
- 后续所有公共文件引入统一用
WEB_ROOT常量拼接,不管在哪个层级的页面写法完全一致:
// 引入header公共文件,全局通用写法 include WEB_ROOT . 'includes/header.php';
Header内部前端资源路径解决方案
你之前用/js/togglemenu.js不生效,大概率是项目没有部署在域名根目录,比如本地访问地址为http://localhost/metrics/website/时,斜杠开头的路径会指向http://localhost/js/togglemenu.js,自然找不到文件。解决方法如下:
- 在
config.php中补充定义前端访问根路径常量:
// 可硬写匹配部署路径,本地测试用这个,上线改为域名即可 define('WEB_BASE_URL', '/metrics/website/'); // 也可以用动态生成的写法,适配任意部署环境,无需手动修改 $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http'; $host = $_SERVER['HTTP_HOST']; $basePath = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/\\'); define('WEB_BASE_URL', $protocol . '://' . $host . $basePath . '/');
- 修改
header.php内的资源引用写法,全局通用无需调整层级:
<script type="text/javascript" src="<?php echo WEB_BASE_URL; ?>js/togglemenu.js" defer></script>
额外说明
你之前尝试的dirname(__DIR__) . '/../togglemenu.js'多了一层不必要的目录回退:如果代码写在header.php中,__DIR__的值固定为website/includes,dirname(__DIR__)已经拿到了website目录,直接拼接/js/togglemenu.js就是正确的服务端路径。
内容的提问来源于stack exchange,提问作者Mads Sander Høgstrup
相关产品推荐
相关产品推荐

