如何在PHP/Javascript中获取跨域301/302跳转的源站点域名
实现可行性说明
该需求可以通过PHP或JavaScript实现,两种方案的具体实现逻辑和限制如下:
服务端PHP实现方案
方案1:读取HTTP Referer头
正常301/302跳转场景下,浏览器会在请求目标域名时携带来源页面的Referer头,PHP可以直接读取该字段获取源站域名:
$referer = $_SERVER['HTTP_REFERER'] ?? ''; // 提取Referer中的域名部分即可得到源站域名
注意:该方案存在概率性失败场景,浏览器隐私设置、HTTPS跨协议跳转、自定义安全规则都可能导致Referer头为空
方案2:跳转拼接参数(推荐,100%可用)
修改所有源站的跳转规则,在跳转到目标域名的URL后拼接来源域名参数,例如源站a.com跳转到target.com?from=a.com,PHP直接读取参数即可:
$fromDomain = $_GET['from'] ?? '';
该方案不受Referer限制,准确性最高,Apache环境下可以直接在源站的Rewrite规则中自动拼接参数,不需要修改业务逻辑。
客户端JavaScript实现方案
方案1:读取document.referrer
前端可以直接读取浏览器提供的Referer属性:
const referer = document.referrer;
限制和PHP读取HTTP Referer的逻辑一致,存在为空的可能。
方案2:读取URL查询参数
如果采用跳转拼接参数的方案,前端可以直接解析当前URL的参数获取来源域名:
const fromDomain = new URLSearchParams(window.location.search).get('from');
注意事项
- 仅依赖Referer的方案无法覆盖所有用户场景,存在小概率获取不到源站域名的情况
- 跳转拼接参数是兼容性最好、准确性最高的实现方案
- 如果源站跳转是在Apache层面配置,可以直接修改rewrite规则自动添加来源参数,无需额外开发
内容的提问来源于stack exchange,提问作者the.bastian
相关产品推荐
相关产品推荐

