什么是Referer?Referer的作用?空Referer是怎么回事?

本文介绍了HTTP请求中的Referer,它表示请求来源。其作用包括防盗链和防止恶意请求。空Referer指头部内容为空或请求中无该头部,如直接在地址栏输入URL。在防盗链设置中,允许和拒绝空Referer有不同效果,但Referer易被伪造。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是Referer?

Referer  是  HTTP  请求header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里有包含  Referer  。比如我在www.sojson.com 里有一个www.baidu.com 链接,那么点击这个www.baidu.com ,它的header 信息里就有:

    Referer=https://www.sojson.com

由此可以看出来吧。它就是表示一个来源。看下图的一个请求的 Referer  信息。

 


 

这里有一个小问题要说明下。

Referer  的正确英语拼法是referrer 。由于早期HTTP规范的拼写错误,为了保持向后兼容就将错就错了。其它网络技术的规范企图修正此问题,使用正确拼法,所以目前拼法不统一。还有它第一个字母是大写。

 

Referer的作用?

1.防盗链。

刚刚前面有提到一个小 Demo  

我在www.sojson.com里有一个www.baidu.com链接,那么点击这个www.baidu.com,它的header信息里就有:

Referer=https://www.sojson.com

那么可以利用这个来防止盗链了,比如我只允许我自己的网站访问我自己的图片服务器,那我的域名是www.sojson.com,那么图片服务器每次取到Referer来判断一下是不是我自己的域名www.sojson.com,如果是就继续访问,不是就拦截。

这是不是就达到防盗链的效果了?

2.防止恶意请求。

比如我的SOJSON网站上,静态请求是*.html结尾的,动态请求是*.shtml,那么由此可以这么用,所有的*.shtml请求,必须 Referer  为我自己的网站。

Referer=https://www.sojson.com

空Referer是怎么回事?什么情况下会出现Referer?

首先,我们对空 Referer  的定义为, Referer  头部的内容为空,或者,一个 HTTP  请求中根本不包含 Referer  头部。

那么什么时候 HTTP  请求会不包含 Referer  字段呢?根据Referer的定义,它的作用是指示一个请求是从哪里链接过来,那么当一个请求并不是由链接触发产生的,那么自然也就不需要指定这个请求的链接来源。

比如,直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含Referer  字段的,因为这是一个“凭空产生”的 HTTP  请求,并不是从一个地方链接过去的。

那么在防盗链设置中,允许空Referer和不允许空Referer有什么区别?

允许 Referer  为空,意味着你允许比如浏览器直接访问,就是空。

如下图:

这就是空的 Referer  

拒绝空的 Referer  。比如我的www.sojson.com的静态资源都是拒绝空的Referer 的。如下图,我访问我的一个图片。


 

看到了吧,直接拒绝访问了,如果有同学在测试我网站的静态资源的时候,记住强制刷新Ctrl + F5 ,因为浏览器有缓存,可能你开始还是可以访问的。

当然。这个你不能完全依赖 Referer  来做一些事情,因为这个最容易伪造来源。

每个语言,都可以,比如 Java  来模拟一个 Httpclient  请求。并且伪造来源。

 

 
  1. /**
  2. * 从工信部获取验证码
  3. * @param session
  4. * @param response
  5. */
  6. public static void getVCode(HttpSession session,HttpServletResponse response){
  7.  
  8. InputStream inputStream = null;
  9. ServletOutputStream outStream = null;
  10. try {
  11. //获取登录框的隐含参数 type="hidden" name="_xsrf"
  12. HttpClient client = new HttpClient();
  13. client.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"UTF-8");
  14. client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
  15. GetMethod method = new GetMethod("http://www.miitbeian.gov.cn/getVerifyCode");
  16. method.setRequestHeader("Connection","close");
  17. method.setRequestHeader("Host", "www.miitbeian.gov.cn");
  18. method.setRequestHeader("Referer", "http://www.miitbeian.gov.cn/icp/publish/query/icpMemoInfo_showPage.action");
  19. method.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0");
  20. // method.setRequestHeader("Cookie", (String)goon);
  21. client.executeMethod(method);
  22. Cookie[] cookies = client.getState().getCookies();
  23. String sid = "",uid="",goon="__jsluid=%s; JSESSIONID=%s";
  24. for (Cookie cookie : cookies) {
  25. String name = cookie.getName();
  26. String value = cookie.getValue();
  27. if("JSESSIONID".equals(name)){
  28. sid = value;
  29. }
  30. if("__jsluid".equals(name)){
  31. uid = value;
  32. }
  33. }
  34. goon = String.format(goon, uid,sid);
  35. //存储工信部Session信息
  36. session.setAttribute("goon", goon);
  37.  
  38. inputStream= method.getResponseBodyAsStream();
  39. //得到图片的二进制数据,以二进制封装得到数据,具有通用性
  40. byte[] data = CacheFindManager.readInputStream(inputStream);
  41. outStream = response.getOutputStream();
  42. outStream.write(data);
  43. outStream.flush() ;
  44.  
  45. } catch (Exception e) {
  46. LoggerUtils.error(BeianGovManager.class, "获取验证码出现异常。", e);
  47. }finally{
  48. try {
  49. inputStream.close();
  50. outStream.close();
  51. } catch (IOException e) {
  52. LoggerUtils.error(BeianGovManager.class, "获取验证码后,关闭流出现异常,请忽略!", e);
  53. }
  54. }
  55. }

好了,就这样吧,有疑问,加群@soso,或者下面留言。知无不言言无不尽。

 

版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/58.html

转载时必须以链接形式注明原始出处及本声明。

<think>我们正在讨论的问题是:在JMeter中设置Referer请求头后,服务器如何识别请求来源? 根据用户提供的引用和之前的回答,我们可以总结如下: 1. JMeter中设置Referer的方法:通过HTTP信息头管理器添加Referer头。 2. 服务器识别机制:服务器通过解析HTTP请求头中的Referer字段来判断请求来源。 引用[1]中提到:referer用于告诉服务器此请求是从哪个页面上发出来的(防盗链)。这意味着服务器可以检查这个字段,如果请求的资源(比如图片)不是从它允许的页面发起的,服务器可能会拒绝(例如返回403错误)。 因此,服务器识别请求来源的机制就是通过读取HTTP请求头中的Referer字段。 我们可以这样组织回答: 一、服务器如何识别Referer 二、服务器如何利用Referer(例如防盗链) 三、如何验证服务器是否正确识别Referer(通过日志等) 注意:引用[2]提到JMeter不是浏览器,因此需要显式设置请求头来模拟浏览器行为,包括Referer。 另外,引用[3]说明了User-Agent的作用,但这里我们关注的是Referer。 引用[4]是一个压力测试的例子,与Referer关系不大,但可以说明服务器可能根据请求头做出不同的响应(如503错误)。 根据这些信息,我们可以给出以下回答:</think>### JMeter设置Referer后服务器识别机制详解 #### 一、服务器识别Referer的核心原理 服务器通过解析HTTP请求头中的`Referer`字段识别请求来源,具体流程如下: ```mermaid sequenceDiagram participant JMeter participant Server JMeter->>Server: 发送HTTP请求(GET/POST) Note over Server: 解析请求头 Server->>Server: 提取Referer值 alt Referer存在且合法 Server-->>JMeter: 200 OK + 返回资源 else Referer缺失或非法 Server-->>JMeter: 403 Forbidden Server-->>JMeter: 或返回错误提示[^1] end ``` #### 二、关键识别环节 1. **HTTP协议规范** `Referer`是HTTP标准请求头字段(RFC 7231),服务器通过以下方式获取: ```nginx # Nginx示例:记录Referer访问日志 log_format main '$remote_addr - $http_referer ...'; ``` - Apache通过`%{Referer}i`获取 - Tomcat通过`request.getHeader("Referer")`获取 2. **防盗链机制** 服务器通过比对Referer与白名单实现资源保护: ```nginx # Nginx防盗链配置 location ~* \.(jpg|png)$ { valid_referers none blocked *.example.com; if ($invalid_referer) { return 403; } } ``` 3. **JMeter模拟的可靠性** 当JMeter正确配置HTTP信息头管理器时: ```markdown | 配置项 | 服务器识别效果 | |--------------|----------------------------------| | 未设置Referer | 服务器视为`直接访问`或`来源缺失` | | 正确设置 | 服务器准确识别为配置的URL来源[^2] | | 动态Referer | 服务器识别为不同来源(需配合变量) | ``` #### 三、验证服务器识别的三种方法 1. **JMeter监听器验证** 添加`查看结果树`监听器,检查请求头是否包含: ``` Referer: https://your-domain.com/page ``` 2. **服务器日志分析** 检查服务器访问日志中的Referer字段: ```log # Nginx日志示例 192.168.1.5 - [01/Jan/2023] "GET /image.jpg HTTP/1.1" 200 "https://jmeter-test.com/page" "JMeter" ``` 3. **防盗链测试验证** | 测试场景 | 预期响应 | 服务器识别状态 | |------------------|----------|---------------------| | Referer=合法域名 | 200 OK | 来源识别成功[^1] | | Referer=值 | 403 | 来源识别为直接访问 | | Referer=恶意域名 | 403 | 来源识别为非法请求 | #### 四、特殊场景处理 1. **HTTPS到HTTP的Referer** 现代浏览器会屏蔽HTTPS页面发往HTTP的Referer,但JMeter仍会发送完整Referer(需显式配置) 2. **Referrer-Policy影响** 当服务器响应头包含: ```http Referrer-Policy: origin-when-cross-origin ``` JMeter需同步调整Referer值以匹配策略要求[^2] 3. **CDN边缘节点识别** 当使用CDN时,源服务器可能收到: ``` X-Forwarded-Host: cdn.example.com Referer: https://user-site.com ``` 需确保CDN配置转发原始Referer > **关键结论**:JMeter通过HTTP信息头管理器设置的Referer会被服务器完整接收和解析,其识别机制与浏览器请求完全一致[^2]。服务器可基于此字段实现防盗链、来源分析、安全策略等关键功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值