- ```html
php跳转到指定url php跳转到指定url
一个老项目里,转到指定用户提交表单后需要跳到一个第三方支付页面。转到指定同事在控制器里写了一句
header('Location: https://pay.example.com/checkout');,转到指定本地测试没问题,转到指定上线后却偶尔报“headers already sent”。转到指定他查了半天,转到指定最后发现是转到指定某个include文件末尾多了一个空行。这种事在PHP里太常见了——跳转本身不难,转到指定难的转到指定是跳得干净、跳得稳。转到指定最直接的转到指定跳转方式就是操作HTTP头。PHP的转到指定
header()函数把Location头发给浏览器,浏览器一看这个头,转到指定立马带着新地址重新请求。转到指定写起来就一行:header('Location: https://example.com/target'); exit;注意那个
exit。转到指定很多人图省事不写,结果后面的代码继续跑,数据库操作、日志记录、甚至再发一个头,全乱套了。我见过一个登录逻辑,跳转后没退出,脚本继续执行到权限检查,把用户又踢回了登录页。加个exit能省掉一堆诡异bug。但
header()有个硬性条件:它必须在任何实际输出之前调用。空格、BOM头、甚至<?php前面的一个换行,都会让header()失效。如果你实在没法保证输出前调用,可以用输出缓冲。在脚本开头加ob_start(),跳转时照样发头,缓冲区里的内容会被丢弃。不过这不是长久之计——缓冲区也有大小限制,大流量下容易出问题。另一个坑是相对路径。写
header('Location: /user/profile')没问题,浏览器会补全域名。但如果你在子目录里,比如/admin/下跳../user/profile,不同浏览器解析结果可能不一样。我习惯一律用绝对URL,哪怕麻烦点,至少不会因为路径拼接出错。有时候你需要在跳转前给用户一个提示,比如“操作成功,正在跳转”。这时候
header()就不合适了,因为它要求立刻响应。可以改用meta标签或者JavaScript。比如:echo '<meta http-equiv="refresh" content="3;url=https://example.com/target">'; echo '操作成功,3秒后自动跳转...';这种方式的缺点是用户能按停止按钮中断跳转,而且对搜索引擎不太友好。但用在后台管理或者临时通知上,挺方便的。我一般只在跳转延迟超过1秒时才用,否则不如直接
header()干脆。还有一种情况是跳转到外部URL时,需要防止开放重定向漏洞。比如
?redirect=//evil.com,如果你直接header('Location: ' . $_GET['redirect']),攻击者就能把用户引到钓鱼站。解决办法是白名单校验,或者只允许站内路径。我见过一个电商网站,登录后跳转参数没过滤,结果被人做成跳转到恶意站点的链接,发在社交平台上骗点击。PHP里还有个函数叫
header_remove(),可以删掉之前设置的Location头。但实际用到的场景很少,除非你在框架里做中间件,需要覆盖跳转目标。普通业务代码里,直接重新发一个Location头也行,但浏览器行为不确定——有的用最后一个,有的用第一个。别给自己找麻烦。最后提一句状态码。默认
header('Location: ...')发的是302临时跳转。如果你做网站改版,旧地址永久迁移到新地址,应该用301:header('Location: https://new.example.com/page', true, 301);301会被浏览器和搜索引擎缓存,下次直接去新地址。但如果你改错了,用户可能几个月都回不来。302更安全,适合临时调整。我个人的习惯是:不确定用哪个时,一律302。
跳转这件事,代码量极少,但细节不少。写的时候多想想输出、退出、路径和状态码,能避开大多数坑。
``` 顶: 2751踩: 246






评论专区