PHP header重定向时$_SERVER['HTTP_REFERER']为空问题排查
$_SERVER['HTTP_REFERER']为空的问题 这个问题我之前也踩过坑,核心原因是浏览器的安全策略限制:你没法通过服务器端手动设置header('Referer: http://sample.com')来强制浏览器发送指定的Referer头,$_SERVER['HTTP_REFERER']的值完全由客户端(浏览器)决定,服务器无法干预。当你用header('Location: ...')做3xx重定向时,大多数浏览器不会沿用你设置的Referer,甚至会直接清空这个字段,所以目标页面拿不到预期的值。
靠谱的解决方案:
既然依赖Referer不可靠,我们换一种更可控的方式传递信息:
用URL参数显式传递来源和邀请信息
这是最稳妥的方案,完全不受浏览器限制。重定向时把邀请码和来源站点一起拼到目标URL里:// sample.com的处理代码 $inviteCode = $_GET['i']; header("Location: http://example.com/?i={$inviteCode}&ref=http://sample.com"); exit;然后在example.com的页面里,直接通过
$_GET['ref']获取来源,$_GET['i']获取邀请码,这样不管浏览器怎么处理Referer,都能拿到正确的信息。用自动提交的表单实现POST重定向(可选)
如果不想把参数暴露在URL里,可以在sample.com生成一个自动提交的表单,把邀请码和来源放在表单字段中,让浏览器主动提交到example.com。这种方式下,浏览器会发送当前页面(sample.com)作为Referer,同时你也能通过POST拿到需要的信息:// sample.com的处理代码 $inviteCode = $_GET['i']; ?> <form id="redirectForm" method="POST" action="http://example.com"> <input type="hidden" name="i" value="<?php echo $inviteCode; ?>"> <input type="hidden" name="ref" value="http://sample.com"> </form> <script> document.getElementById('redirectForm').submit(); </script> <?php exit;然后在example.com用
$_POST['i']和$_POST['ref']获取对应的值。
补充说明:
正常情况下,如果用户是主动点击链接从sample.com跳转到example.com,浏览器会自动发送Referer,但服务器端的3xx重定向属于“间接跳转”,浏览器出于安全考虑(防止伪造Referer进行钓鱼等攻击),通常不会保留或接受服务器设置的Referer头。所以永远不要依赖$_SERVER['HTTP_REFERER']来传递关键业务信息,显式的参数传递才是可靠的选择。
内容的提问来源于stack exchange,提问作者m1k3y3

