在CodeIgniter中获取用户访问的原始来源URL可行性咨询
获取用户访问的原始来源路径(A.com→B.com→xyz.com)
首先得给你泼个冷水:仅通过服务器端(包括.htaccess)或者原生HTTP机制,是没办法直接获取到最开始的A.com的,原因很简单:
浏览器的Referer(注意是拼写错误的Referer,不是Referrer)请求头,只会记录用户跳转过来的直接上一个站点,也就是B.com。这是HTTP协议的设计,同时也是浏览器隐私保护的一部分——浏览器不会把用户的整个浏览历史链暴露给网站,所以xyz.com根本收不到A.com的信息。
那有没有替代方案?分两种情况来看:
情况1:中间站点B.com是你可控的
这是唯一可行的路径:在B.com跳转到xyz.com的时候,主动把B.com自己的Referer(也就是A.com)作为参数传递过去。比如:
- 在B.com的后端代码里生成跳转链接:
<a href="https://xyz.com/?original_referrer=<?php echo urlencode($_SERVER['HTTP_REFERER']); ?>">跳转到xyz.com</a> - 或者用前端JS实现跳转:
const originalReferrer = encodeURIComponent(document.referrer); window.location.href = `https://xyz.com/?original_referrer=${originalReferrer}`;
然后在xyz.com这边,就可以通过$_GET['original_referrer']拿到A.com的地址了。
情况2:中间站点B.com不可控
这种情况下,没有任何可靠的方法能获取到A.com。别浪费时间尝试了:
- JavaScript的
window.history对象受同源策略严格限制,根本读不到跨域的历史记录; - 任何服务器端配置(包括.htaccess)都只能处理请求头里已有的信息,而请求头里根本没有A.com的痕迹;
- 第三方追踪工具也做不到,因为浏览器的隐私机制会阻止这类信息泄露。
关于.htaccess的补充说明
.htaccess是Apache用来处理请求规则的配置文件,它能操作的都是HTTP请求的现有信息——比如修改请求头、重写URL等等,但它没法凭空生成不存在的请求头数据。既然请求里没有A.com的任何信息,.htaccess自然也帮不上忙。
总结一下:只有当你能控制中间跳转的B.com时,才能通过传递参数的方式拿到原始来源A.com;否则,这个需求从技术上是无法实现的。
内容的提问来源于stack exchange,提问作者Asif Alamgir
相关产品推荐
相关产品推荐

