PHP多页面引入header.php后跳转login.php路径异常如何解决
问题原因
浏览器解析Location的相对路径时,是以当前访问的页面URL为基准,而不是服务端PHP文件的存储路径。所以header.php被不同层级的页面引入时,相对路径的计算结果就会不符合预期。
解决方案
方案1:使用站点根路径跳转(最推荐,实现最简单)
直接用/开头的绝对路径,代表站点根目录,不管当前访问的页面在哪个子目录,都会统一跳转到根目录下的login.php:
if(!logged_in()){ // 直接以站点根为基准跳转 header('Location: /login.php'); exit; }
如果你的项目部署在域名的子目录下(比如访问地址为https://xxx.com/myproject/),可以统一配置项目根前缀:
// 在header.php开头定义项目根路径,部署时仅需修改一次 define('APP_ROOT', '/myproject/'); if(!logged_in()){ header('Location: ' . APP_ROOT . 'login.php'); exit; }
如果不想写死前缀,也可以动态计算项目根路径,适配不同部署环境:
// 自动获取当前项目的根URL路径 define('APP_ROOT', rtrim(dirname($_SERVER['SCRIPT_NAME']), '/') . '/'); if(!logged_in()){ header('Location: ' . APP_ROOT . 'login.php'); exit; }
方案2:以header.php所在目录为基准计算路径
如果需要严格以header.php的存储位置为基准计算跳转路径,可以通过服务端路径转URL实现:
// 在header.php中获取自身所在目录的URL路径 $headerDirUrl = dirname($_SERVER['PHP_SELF']) . '/../layout/'; // 拼接login.php路径并归一化处理掉相对路径符号 $loginUrl = preg_replace('#/[^/]+/\.\./#', '/', rtrim($headerDirUrl, '/') . '/../login.php'); if(!logged_in()){ header('Location: ' . $loginUrl); exit; }
额外注意事项
- PHP中引入文件的路径分隔符建议统一用
/,不要用Windows系统的\,避免部署到Linux服务器时出现路径识别错误,比如你现有的引入代码可以改成:// index.php的引入代码 require_once(__DIR__ . '/layout/header.php'); // user.php的引入代码 require_once(__DIR__ . '/../layout/header.php'); - 所有
header跳转后必须加exit或die,否则跳转后代码还会继续执行,存在安全风险。
内容的提问来源于stack exchange,提问作者mm1234
相关产品推荐
相关产品推荐

