php 的 `header('location: $redirecturl')` 因单引号导致变量不解析,实际发送了字面字符串 `$redirecturl`,造成 404;正确做法是用双引号或字符串拼接确保变量值被插入。
在 PHP 中,header() 函数用于发送原始 HTTP 头信息,常用于页面重定向(如登录成功后跳转到首页)。但一个极易被忽视的语法陷阱是:变量在单引号字符串中不会被解析。你代码中的这行:
header('Location: $redirectURL');⚠️ 是完全错误的——PHP 将其视为字面量字符串 "Location: $redirectURL",浏览器收到的响应头是:
Location: $redirectURL
而非预期的 Location: /Shape_Search/app/view/login.php 等真实路径,最终导致服务器尝试访问一个名为 $redirectURL 的文件,自然返回 404。
header('Location: ' . $redirectURL);header("Location: $redirectURL");? 注意:双引号虽支持变量插值,但若 $redirectURL 含换行、空格或未过滤的用户输入(极不建议!),可能引发安全风险或 HTTP 头注入。因此生产环境强烈推荐方式 1(拼接)。
即使修正了变量解析问题,仍需确认以下几点,否则仍可能跳转失败:
路径必须为绝对 URL 或以 / 开头的绝对路径
header('Location: login.php')(相对路径) ❌ —— 行为不可靠,取决于当前请求 URI。
✅ 正确示例:
$redirectURL = 'http://localhost/Shape_Search/app/view/login.php'; // 完整 URL // 或 $redirectURL = '/Shape_Search/app/view/login.php'; // 根相对路径(推荐)
确保重定向前无任何输出
header() 必须在任何 HTML、echo、空白符(包括文件末尾的换行)之前调用。可在脚本开头添加:
if (headers_sent($file, $line)) {
die("Headers already sent in $file on line $line");
}exit() 或 die() 不可省略
重定向后必须终止脚本执行,否则后续代码仍会运行,可能导致逻辑混乱或重复提交。
将原代码中所有类似 header('Location: $redirectURL'); 替换为:
// ✅ 修正后:拼接 + 严格路径 + 强制退出
if (!empty($redirectURL)) {
header('Location: ' . $redirectURL);
exit();
} else {
header('Location: /Shape_Search/app/view/index.php');
exit();
}同时,请统一检查项目中所有 FORM、HOM

| 错误点 | 正确做法 |
|---|---|
| 单引号内写 $redirectURL → 变量不解析 | 改用 'Location: ' . $redirectURL 或 "Location: $redirectURL" |
| 使用相对路径(如 login.php) | 使用根路径 /path/to/login.php 或完整 URL |
| 重定向后未 exit() | 每次 header() 后紧跟 exit(); |
| 路径常量拼接错误(如 user_util/$redirectURL) | 检查 FORM 等常量定义,确保其值本身已是完整有效路径 |
遵循以上规范,即可彻底解决因 header() 变量未解析导致的 404 重定向故障。