導讀
在進一步介紹referer
之前,先提以下幾個問題,看你是否都能回答上來。帶著這幾個問題和疑問去讀這篇文章,更有針對性,相信你的收獲也會更大。
問題匯總:
1、什么是 referer? 有什么用?2、怎么設置 referer 白名單?3、有哪些方式可避開 referer 限制?4、如何自定義請求的 referer 值?
常見的 http 請求中,header 部分往往都會帶有一個referer
字段。如下:
該字段記錄了請求來源。以上圖為例,請求為:
https://pinpai.1688.com/rpc/imall/channel/recentenroll.json
場景為 IMall 站點(https://imall.1688.com )展示的一個最新入駐信息:
因為是從 IMall 站點頁面發出的 http 請求信息,所以referer
的字段信息,就是該站點的 host:https://imall.1688.com
。
但也有一些 http 請求的referer
字段為空,或者干脆不包含這個字段。如:a) 用戶直接在地址欄輸入 url 鏈接;b) 從瀏覽器的收藏夾中直接打開收藏鏈接;c) 后端代碼直接發起 http 請求,未配置 referer 信息;d) 用戶的瀏覽器設置中關閉了攜帶 referer 信息的功能等。
正常情況下,當前頁面加載時發起請求,或用戶在頁面點擊鏈接發起請求,瀏覽器會自動在 http 請求 hearder 的referer
字段中,添加當前頁面的域名(如上圖的場景)。
但若直接在瀏覽器地址欄中輸入該請求 url,因沒有來源,也就不會存在referer
字段。如:A 頁面中有一個B 頁面的跳轉鏈接(https://www.bpage.com
),A 頁面的域名是www.apage.com
,那么當用戶在A 頁面點擊了該跳轉鏈接時,跳轉鏈接的請求頭(request header)中,攜帶的referer
信息就是www.apage.com
。
小插曲:
英語好的小伙伴是不是發現了一個問題,
referer
的拼寫不對的吧?怎么少了個"r",正確的拼寫應該是referrer
。其實,在制定標準時,提交給官方的字段名就是少了個"r"字母的referer
,神奇的是,所有的人都“默契地”忽略了該單詞的拼寫錯誤,因此referer
也就成了官方標準,錯了就錯了吧,反正也不影響使用。所以屏幕前的小伙伴往后在使用該字段時,一定要注意拼寫,是 referer,不是 referrer。
http 請求頭 header 中設置了referer
字段,自然有此它的作用。常用的作用有兩個,一是統計訪問來源,二是設置防盜鏈。
舉個栗子。
在 IMall 站點(imall.1688.com
)頁面中嵌入了品牌站的鏈接(https://pinpai.1688.com
),那么對于品牌站的服務器而言,就可以根據referer
字段來統計所有訪問來源中,從 IMall 站點過來的訪問量有多少。
首先看下,什么是盜鏈。
百度百科對"盜鏈"詞條的解釋:
服務提供商自己不提供服務的內容,通過技術手段繞過其它有利益的最終用戶界面(如廣告),直接在自己的網站上向最終用戶提供其它服務提供商的服務內容,騙取最終用戶的瀏覽和點擊率。受益者不提供資源或提供很少的資源,而真正的服務提供商卻得不到任何的收益。
上面這段話比較繞,說的比較官方,可簡單理解為:某些 http 請求并不是在任何場景下都可以訪問。
我們做個簡單的比喻哈。像淘寶上店家售賣的商品圖、專業圖片網站上的圖片,這些都是賣家或者網站的寶貴資源,不能輕易被其他網站利用和展示。比如淘寶商家費了好大勁拍了個好看的模特試穿圖,攝影師苦等了個把月才拍到的大漠落日景象,直接被一個第三方網站在他們自己的網站上放了鏈接展示,這還不得讓拍照片的人氣的吐血啊。。。
再說了,淘寶平臺也不允許這么干,直接把他們的命根子——流量給分攤過去了,淘寶平臺是不會允許這種事情發生的。
我們看個示例:
上圖是淘寶的一個商品頁面,左側紅框中的是商品圖片對應的 http 請求:
https://img.alicdn.com/tfscom/i3/TB1GypLh1sAV1JjSZFsYXGdZXXa_M2.SS2_460x460xz.jpg
referer
的值是在*.taobao.com
這個二級域名下:
https://market.m.taobao.com/app/tb-source-app/aiguangjiepc/item/index.html?spm=a21bo.2017.2001.7.5af911d9dPHIsp&itemId=200406358577
那么,如果將 http 請求放在百度首頁中訪問,會怎樣呢?請看下圖:
在控制臺輸入如下語句
location.
按下回車后,訪問被禁止,這就是淘寶平臺設置的防盜鏈功能。
上面我們看到了盜鏈的危害,怎么避免盜鏈呢?答案就是referer
字段。當然了,通過referer
字段來防止盜鏈只是其中一種方式,像配置nginx
也可以達到防盜鏈的目的,但本文主要探討referer
字段的相關知識點,因此就只說明如何通過referer
字段的設置來達到防盜鏈的目的,其他途徑大家可自行搜索,不在本文的討論范圍內~
比如,后臺服務器的一個 http 接口,希望其訪問來源只能是淘寶站點(https://www.taobao.com )及其二級、三級等子站點,其他來源的 http 請求我們拒絕處理。那么就可以通過設置 http 請求 header 的referer
字段來達到這個目的。
通常,會有個白名單列表來圈定期望來源。比如,在服務器的后臺應用(springboot 框架)中,就可以通過配置的方式,限定哪些接口是允許哪些來源的請求訪問:
# referspring.security.filters.referer-validation.enabled = true## Spring Security HTTP 安全域名列表,可選值,多值通過","分割,通過""作為換行連接符號spring.security.http.safe.domains = *.taobao.com
一般來說,頁面發起的 http 請求,referer
字段的配置,通過前端代碼是無法干預的,是由瀏覽器自主設置添加的,當然了,如果不想攜帶referer
字段,可在瀏覽器的設置中關掉即可。
2.2 節中的防盜鏈功能,也不能全指望referer
字段,對于referer
字段,也是可以偽造的。如下:
HttpURLConnection conn;conn.setrequestproperty("refer", "http://imall.1688.com");
因此,既然能偽造,也就不能完全信任referer
字段。
Set<String> refererSet = new HashSet<>(Arrays.asList("*.1688.com", "*.alibaba-inc.com"));String referer = request.getHeader("REFERER");for (String str : refererSet) { if (Pattern.matches(str, referer)) { // ... }}
# referspring.security.filters.referer-validation.enabled = true## Spring Security HTTP 安全域名列表,可選值,多值通過","分割,通過""作為換行連接符號spring.security.http.safe.domains = *.taobao.com
對于限定了 referer 范圍的請求,在 mock 請求的時候,必須帶上特定的 referer,那么,如何操作呢?有以下幾種方式。
postman 是一個 chrome 插件,可 mock 多種類型請求,常用的就是 post 和 get。對于限定請求來源的請求,可在 header 中設置 referer 字段。
若添加 referer 時,出現如下提示:
說明設置的 referer 字段未生效,需安裝 postman interceptor 插件(詳情)。同時設置 interceptor 為 true,如下:
這是一款插件,用于配置特定請求的 referer 字段。配置方式如下:
使用起來也較簡單,每個輸入的網址右側有幾個按鈕:
to
: 表示要訪問這個網址from
: 表示請求是從這個網址鏈接過去3rd
:RegEx
: 以正則方式約束Normal
: 默認方式Custom
: 自定義 refererBlock
: 需阻斷的 referer如下圖:
這種方式比較簡單。
舉個栗子就明白了。對于請求:
https://pinpai.1688.com/rpc/imall/channel/recentenroll.json
其要求必須有 header 中的 referer 字段,并且正則匹配如下:
*.1688.com, *.alibaba-inc.com
那么就可以在 1688 網站的任何一個網頁,以 imall.1688.com 為例,將任何一個可點擊控件的鏈接值設為該請求。操作如下圖:
修改后,點擊"首頁"就可請求到結果。因為瀏覽器會默認將當前頁面的域名(imall.1688.com)設為 referer 值。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
移動Sim大卡換小卡?機主本人攜帶身份證,到任意一家移動營業廳,說可以辦理換卡業務。營業廳會根據您的需求更換大小合適的手機卡。以前手機卡是大卡,后來換成了minisim卡,就是老人機用的那種。隨著技術要求和變化,現在是micro sim卡,大部分手機都可以插。我的卡是外地的,可以去當地移動營業廳換小卡或者剪卡嗎?你可以 不要換一張小卡片。如果你的卡是大卡,你只能去手機店換,讓它給你剪成小卡。想換小...
rice中c發音相同的單詞?英語單詞rice中的c發音為/s/,所以發音相同的單詞是face。米,就是大米的意思。我想要一碗米飯。我想要一碗米飯。臉就是臉的意思,比如那個小男孩是圓臉。這個小男孩有一張圓臉。還有一個和他發音一樣的詞,mouse,就是老鼠的意思。cold和rice中的c發音一樣嗎?英語單詞cold和rice中輔音字母c的發音完全不同。輔音字母c有兩種發音。1.當c在I,e,Y之前時,...
世界十大危險機場排名世界十大機場最難降落?世界最復雜機場?1、盧卡拉機場盧卡拉機場位于尼泊爾東部的盧卡拉鎮,喜馬拉雅山腹地,被稱為世界屋脊上的跑道。機場跑道很短,只有460米,坡度很大,達到了18.5學位。機場只有06號跑道可以降落,跑道的盡頭是懸崖。如果一次近進失敗,就沒有復飛的可能。此外,由于機場位于高山腹地,氣象條件復雜,亂流眾多,無可爭議地位居世界十大危險機場之首。2、特崗汀機場特崗汀機場...