PHP header跳转报错:请求URL未找到,手动访问链接正常
问题分析与解决方案
你遇到的跳转错误,核心问题出在header()函数的字符串引号使用错误,还有一个容易被忽略的执行顺序问题,我来帮你一步步梳理:
1. 变量未解析的关键原因
看你代码里的这行跳转代码:
header('Location: .$final_link');
PHP里有个重要规则:单引号包裹的字符串不会解析内部的变量,所以服务器实际收到的跳转地址是字面量.$final_link,而不是你拼接好的真实URL——这就是为什么手动访问链接正常,但用header跳转时会报错“请求的URL /.$final_link 未找到”。
2. 两种可行的修正方案
方式一:改用双引号(推荐,写法更简洁)
双引号会自动解析内部的变量,直接把变量放进去就行:
header("Location: $final_link");
方式二:字符串拼接(适合习惯用单引号的场景)
把单引号字符串和变量用.拼接起来,也能正确传递URL:
header('Location: ' . $final_link);
3. 额外注意:输出顺序与session销毁的问题
- 你代码里先执行了
echo $final_link;,这会向浏览器输出内容,而header()函数必须在任何输出(包括echo、HTML标签、甚至代码开头的空格)之前调用,否则会触发PHP警告,甚至导致跳转失效。如果只是调试用echo,上线前记得删掉;如果需要记录链接,可以用error_log($final_link)代替,把内容写到服务器日志里,不会影响header发送。 - 另外,
exit;语句之后的代码永远不会执行,所以你现在写的unset($_SESSION...)根本不会运行。如果需要销毁这些session变量,要把它们放到header()和exit之前,或者在跳转后的目标页面里处理session销毁。
修正后的完整代码示例:
<?php session_start(); $user_id = $_SESSION['user_id']; $api_id = $_SESSION['api_id']; $limit = $_SESSION['limit']; $final_link = 'http://www.mywebsite.info/payment/public/createPayment/' .$user_id .'/' .$api_id .'/' .$limit; // 调试用:把链接写入日志,避免影响header // error_log($final_link); // 先销毁session变量,再跳转 unset($_SESSION["user_id"]); unset($_SESSION["api_id"]); unset($_SESSION["limit"]); header("Location: $final_link"); exit; ?>
内容的提问来源于stack exchange,提问作者zoenightshade
相关产品推荐
相关产品推荐

