HTTP的Referer头部有什么作用?

  • Post category:Python

HTTP头部是客户端和服务端之间的交流体系。Referer是HTTP的一个头部字段,用于标识HTTP请求来源的地址,即上一个页面的地址。它可以在浏览器中被禁用,而且可以被篡改,但它仍然是一个非常有用、重要的头部字段。

Referer用于以下几点:

  1. 统计分析

Referer可以用于网站某一页被访问的来源量,帮助网站分析用户的行为,为后续网站推广和营销提供方向。比如,如果我们在编写广告时,可以在链接中添加“utm_source=XXX”的参数,当用户从这个链接访问我们的页面时,就可以通过Referer判断这个访问是从哪个广告推荐链接过来的。

  1. 防盗链

Referer还可以用于防止盗链。比如,我们有一张图片需要放到我们自己的网站上,那么我们可以设置Referer只允许来自我们自己的网站域名的请求访问这张图片。当有其他网站在未授权的情况下直接引用我们的图片时,我们可以根据Referer是否来自我们自己的网站来判断是否是盗链,并进行相应的处理。

下面是两个示例,一是统计分析,二是防盗链。

示例1:统计分析

假设我们有一个form表单,当我们提交该表单时,页面会跳转到result.html,并且在地址栏中添加上请求参数,以达到统计的目的。

代码如下:

<!-- form表单 -->
<form action="/result.html" method="post">
  <input type="text" name="username" placeholder="Username">
  <input type="text" name="password" placeholder="Password">
  <button type="submit">Submit</button>
</form>

当我们提交该表单时,可以通过JavaScript取到Referer,然后在页面跳转时将Referer作为参数添加到地址中,以实现统计分析。

代码如下:

// JavaScript获取Referer
var referrer = document.referrer;

// 更改页面跳转链接,并添加Referer参数
document.querySelector("form").addEventListener("submit", function(event) {
  event.preventDefault();
  window.location.href = '/result.html?referrer=' + encodeURIComponent(referrer);
});

这样,我们就可以在result.html中拿到Referer参数,并对访问来源进行统计分析了。

示例2:防盗链

我们假设有一张图片,需要放到我们的网站上,并且只允许我们自己的网站访问。

代码如下:

<!-- 网站A -->
<img src="https://websiteB.com/image.jpg">

我们可以在网站B(图片的来源)的服务器上设置Referer只允许来自网站A的请求访问。

代码如下:

// PHP代码
$referer = $_SERVER['HTTP_REFERER']; // 获取Referer

if (strpos($referer, 'https://websiteA.com') !== false) {
  header('Access-Control-Allow-Origin: https://websiteA.com'); // 只允许网站A访问
  header('Content-Type: image/jpeg'); // 设置图片类型
  readfile('image.jpg'); // 输出图片
} else {
  header("HTTP/1.1 403 Forbidden"); // 返回403禁止访问
  echo "You are not authorized to access this resource.";
  exit;
}

当网站A访问时,我们就可以正常获取图片。而其他未授权的来源就无法通过Referer访问我们的图片了。

以上就是关于Referer头部的作用和使用示例。当然,在实际应用中,我们还需要注意Referer可能被篡改和禁用的问题,且不应过分依赖它来做安全控制,应该综合使用其他技术手段,以更好地保证应用的安全和可靠性。