浏览器发送HTTP请求时Referer字段来源及改写document.referrer无效问题
为什么修改document.referrer不影响HTTP请求头的Referer字段?
你这段代码改的只是浏览器暴露给JavaScript的DOM接口返回值,和HTTP请求头里的Referer完全是两回事:
- HTTP请求头的
Referer是浏览器网络层内部生成的,它的来源是当前页面的真实导航上下文:比如从页面A点击链接跳转到页面B,Referer就是A的URL;直接在地址栏输入网址打开页面,Referer就是空。这个值由浏览器底层维护,JavaScript无法直接篡改。 document.referrer只是浏览器提供给JS读取上述导航来源的一个“访问入口”,你用Object.defineProperty重写它的getter,只是让JS代码里读到的document.referrer变成空,但浏览器底层记录的真实导航来源并没有被修改。所以发起HTTP请求时,浏览器还是会用真实值生成Referer请求头。
补充:如果想控制Referer字段,只能通过合法配置方式,比如页面的<meta name="referrer" content="xxx">标签,或者服务器端的CSP referrer策略,JS直接修改DOM接口是无效的。
你的测试代码:
Object.defineProperty(Document.prototype, 'referrer', { get: function(){ return ''; } }); // document.referrer --> ''
内容的提问来源于stack exchange,提问作者GeekChen
相关产品推荐
相关产品推荐

