从referer角度详解

一、referer翻译

Referer一般被译为“引用页”、“引荐页面”、“来源页”等。在HTTP协议中,当浏览器向Web服务器请求某个资源时,通常会带上Referer信息,表示请求来源于哪个页面。

二、如何允许referer为空

通常情况下,浏览器会在请求头中自动添加Referer信息。但是,在某些情况下,我们希望浏览器不要传递Referer信息,甚至希望Referer信息为空。这时可以通过以下手段实现:

1、设置meta标签:许多网站会通过设置meta标签来禁止Referer信息泄露。

<meta name="referrer" content="no-referrer">

2、使用JavaScript:在发送请求之前,可以使用JavaScript代码来指定请求头,从而达到限制或清除Referer信息的目的。

fetch('http://example.com', {
  headers: {
    'Referer': ''
  }
})

三、referer字段的作用

Referer字段在很多场景下都有着重要的作用,下面列举几个常见的应用场景:

1、防盗链:有些站点希望通过Referer信息来判断图片、视频等资源的请求来源,从而进行防盗链操作。

if(!strpos($_SERVER['HTTP_REFERER'], 'http://www.example.com/')) {
  exit('非法访问!');
}

2、统计分析:通过Referer信息,可以了解到用户从哪些站点链接访问、搜索引擎关键词、页面URL等等,有助于优化站点SEO、分析用户行为、制定运营策略等。

//统计百度搜索引擎的关键词
if(strpos($_SERVER['HTTP_REFERER'], 'http://www.baidu.com/') !== false) {
  $q = str_replace('q=', '', parse_url($_SERVER['HTTP_REFERER'])['query']);
  $keyword = urldecode($q);
  add_statistic('baidu', $keyword);
}

四、referer 360没有

360浏览器在某些情况下不会发送Referer信息,这可能会对某些站点的安全策略、统计分析等功能造成问题。如果需要在360浏览器中使用Referer信息,可以通过以下方式解决:

1、通过JavaScript手动添加:可以通过JavaScript代码来手动添加Referer信息。

var img = new Image();
img.src = 'http://example.com/image.jpg';
img.setAttribute('referrerPolicy', 'unsafe-url');

2、使用nginx反向代理:通过nginx的反向代理配置,可以在后端获取普通浏览器中的Referer信息。

location /example/ {
  proxy_pass http://example.com/;
  proxy_set_header Referer "http://example.com/";
}

五、referer check error

在某些情况下,我们可能会在后台代码中检查Referer信息。但是,由于Referer信息可能会被篡改、伪造、隐藏等,因此需要进行一些处理才能确保其可靠性。

1、检查Referer是否为空:虽然我们可以通过JavaScript或meta标签来清除Referer信息,但在前端无法控制的场景下,Referer信息可能为空。因此在代码中检查Referer是否为空很重要。

if(empty($_SERVER['HTTP_REFERER'])) {
  exit('非法访问!');
}

2、检查Referer域名:在某些场景下,我们可能希望只接受来自特定域名的Referer信息。在检查Referer域名时,需要考虑Referer信息可能会被修改或伪造的情况。

$referer = parse_url($_SERVER['HTTP_REFERER']);
if($referer['host'] !== 'www.example.com') {
  exit('非法访问!');
}

六、百度地图的referer

在使用百度地图API时,需要在请求中添加合法的referer信息,否则会返回错误码。referer信息由“协议+域名”的形式组成,例如“http://localhost/”。

<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=YOUR_APP_KEY"></script>

<script type="text/javascript">
    // 创建Map实例
    var map = new BMap.Map("allmap");
    // 初始化地图
    map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);
</script>

七、微信小程序设置referer选取

在使用微信小程序的开发者工具时,可以在菜单栏中的“项目”-“设置”中设置referer地址。设置referer地址后,在小程序中调用其他API时,请求头中会带上referer信息。

//设置referer地址
wx.setStorageSync('test_referer', 'http://www.example.com/');

//发送请求
wx.request({
  url: 'http://api.example.com/',
  header: {
    'referer': wx.getStorageSync('test_referer')
  }
});

原创文章,作者:PSFF,如若转载,请注明出处:https://www.506064.com/n/144862.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PSFFPSFF
上一篇 2024-10-26 11:53
下一篇 2024-10-26 11:53

相关推荐

  • 从ga角度解读springboot

    springboot作为目前广受欢迎的Java开发框架,其中的ga机制在整个开发过程中起着至关重要的作用。 一、ga是什么 ga即Group Artifacts的缩写,它是Mave…

    编程 2025-04-29
  • Python中角度变弧度

    本文将从以下几个方面详细阐述Python中角度变弧度的实现方法和应用场景。 一、角度和弧度的概念 在Python中,角度和弧度这两个概念是经常用到的。角度是指单位圆上的作用角度,其…

    编程 2025-04-28
  • 从多个角度用法介绍lower down

    lower down是一个常用于编程开发中的操作。它可以对某个值或变量进行降低精度的处理,非常适合于一些需要精度不高但速度快的场景。那么,在本文中,我们将从多个角度解析lower …

    编程 2025-04-27
  • 数学符号角度的读法

    数学符号是用来表示数学概念、关系和运算的工具。正确理解数学符号的意义对于学习数学、应用数学至关重要。本文将从多个方面介绍数学符号角度的读法。 一、基础符号 1、数学符号:&#822…

    编程 2025-04-27
  • 从初学者角度出发,noc Python比赛

    本文将从初学者的角度出发,深入探讨noc Python比赛。包括如何准备比赛,比赛难度分析,以及必备的编程技能等。我们将一步一步带领大家进入Python编程的世界。 一、比赛准备 …

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25

发表回复

登录后才能评论