從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/zh-tw/n/144862.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
PSFF的頭像PSFF
上一篇 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

發表回復

登錄後才能評論