
本文详解如何在 php 中通过 header() 函数安全、可靠地实现同页面内仅修改 url 查询参数(如 ?no=1 → ?no=2)的重定向,指出常见拼接错误原因,并提供健壮、可复用的编码实践。
本文详解如何在 php 中通过 header() 函数安全、可靠地实现同页面内仅修改 url 查询参数(如 ?no=1 → ?no=2)的重定向,指出常见拼接错误原因,并提供健壮、可复用的编码实践。
在 PHP 开发中,常需基于当前请求参数动态跳转至同一脚本的不同状态(例如分页、题号切换、步骤导航等)。典型场景是:用户访问 exam_question.php?no=1,点击“下一题”后跳转至 exam_question.php?no=2。此时最自然的做法是使用 header() 发送 HTTP 重定向:
header("Location: exam_question.php?no=" . ($_GET['no'] + 1));
exit;但开发者常发现:该代码执行后并未跳转到预期的 ?no=2,而是反复停留在 ?no=1 —— 这并非 PHP 版本(如 7.3.21)缺陷,而是表达式求值与字符串拼接逻辑被误解所致。
根本原因在于:$_GET['no'] 是字符串类型(如 "1"),而 + 在 PHP 中对字符串执行隐式类型转换和数值加法。看似无害,但若原始 URL 中 no 参数缺失、为空、含非数字字符(如 ?no= 或 ?no=abc),$_GET['no'] + 1 将返回 1(空字符串或非法字符串转为 0,再加 1),导致重定向始终指向 ?no=1,形成死循环。
✅ 正确做法是显式校验并转换参数,确保逻辑健壮:
立即学习“PHP免费学习笔记(深入)”;
// 1. 检查参数是否存在且为有效整数
if (!isset($_GET['no']) || !is_numeric($_GET['no'])) {
// 参数异常时降级处理(如跳转首页或报错)
header("Location: exam_question.php?no=1");
exit;
}
// 2. 安全转换为整数并计算新值
$nextNo = (int)$_GET['no'] + 1;
// 3. 执行重定向(注意:Location 首字母大写为规范,且必须在输出前调用)
header("Location: exam_question.php?no=$nextNo");
exit; // ⚠️ 关键:防止后续代码执行? 关键注意事项:
- header() 必须在任何实际输出(包括空格、BOM、echo、HTML)之前调用,否则触发 headers already sent 错误;
- 始终在 header() 后紧跟 exit 或 die(),避免重定向后脚本继续执行;
- 不要依赖未过滤的 $_GET 数据;生产环境应结合 filter_input() 进行更严格的验证;
- 若需支持更复杂参数(如多参数保留),建议使用 http_build_query() 构建 URL:
$params = $_GET;
$params['no'] = (int)($params['no'] ?? 0) + 1;
$query = http_build_query($params);
header("Location: exam_question.php?$query");
exit;综上,问题本质不是 header() 失效,而是对输入数据缺乏防御性处理。遵循参数校验 → 安全转换 → 显式拼接 → 强制终止的四步法,即可稳定实现精准的同页参数跳转。











