HTTP請求頭referer

本人微信公衆號:前端修煉之路,歡迎關注。

前言

前幾日用form表單提交一個留言,發現一個奇怪的問題。php

留言板有個來源的字段,用來獲取網頁的地址。測試時發如今谷歌Chrome瀏覽器中,能夠正確獲取到網址來源,而後用火狐Firefox瀏覽器,卻沒法正確獲取到網址來源。由於後臺使用的是PHP,留言成功以後經過JS彈出alert提示框,而後再經過location.href跳轉回留言頁面。html

因此後臺就須要準確的獲取到留言頁面的地址,可是後臺並無正確的獲取到留言頁面地址。這是爲啥呢❓❓❓前端

Chrome瀏覽器和Firefox瀏覽器對比

看了後臺獲取來源的代碼以後,瞭解到是經過$_SERVER["HTTP_REFERER"] 這個PHP變量獲取的。而後就去翻PHP文檔,找到了HTTP_REFERER變量的文檔說明:web

引導用戶代理到當前頁的前一頁的地址(若是存在)。由 user agent 設置決定。並非全部的用戶代理都會設置該項,有的還提供了修改 HTTP_REFERER 的功能。簡言之,該值並不可信。

去百度百科裏面,又看到以下內容:chrome

HTTP Referer是header的一部分,當瀏覽器向web服務器發送請求的時候,通常會帶上Referer,告訴服務器該網頁是從哪一個頁面連接過來的,服務器所以能夠得到一些信息用於處理。

從上面的論述中咱們能夠獲得以下幾點結論:後端

  1. http_referer由瀏覽器生成,並非全部瀏覽器都會設置該值。
  2. http_referer能夠僞造,並不可信。

經過谷歌和火狐瀏覽器自帶的調試工具,能夠看到HTTP請求頭信息瀏覽器

chrome瀏覽器

firefox瀏覽器

從上圖能夠發現,Chrome瀏覽器中的請求頭中的Referer地址爲詳細的頁面地址信息,而Firefox瀏覽器中的請求頭中的Referer地址,卻只顯示了域名信息。服務器

難道是Firefox瀏覽器設置的問題嗎? 因此我又去Stackoverflow查找了一番。微信

Stackoverflow

從上圖能夠得出兩個結論:svg

  1. HTTP_REFERER這個變量真是不可信
  2. Firefox瀏覽器容許用戶修改這個字段

那在Firefox瀏覽器中怎麼修改這個字段呢?

firefox-config

在火狐瀏覽器中輸入about:config,而後搜索network.http.send,找到network.http.senRefererHeader,將這個字段值修改成0,就會禁止瀏覽器發送refer信息。

HTTP_REFERER的用途

HTTP_REFERER提供了引導用戶代理到當前頁的前一頁的地址信息。

常見的一些應用場景有:

  • 統計文章來源。例若有多少次是來自谷歌搜索結果,多少次來自百度搜索結果等。
  • 圖片防盜鏈。不是本身站點上的訪問,圖片顯示404等。

若是你常常寫博客,就必定會遇到盜用你辛辛苦苦整理過的文章不跟你打任何招呼甚至連原文連接都一併抹除的網站,文字這個層面咱們無法控制,可是圖片這個層面咱們是能夠控制的。

舉個例子,若是你也曾複製過一些相似騰訊等網站的文章,你會發現黏貼下來發表以後常常出現圖片沒法顯示,這是如何作到的呢?

場景:a站點的圖片所有存儲在c站點(雲服務器)上,c站點將識別調用方是否來自a站點,不然顯示一張錯誤圖片,b站是盜圖網站。a站和b站的代碼一致,以下所示:

<img src="http://www.c.com/image.php?fname=jb.png" width="500px" height="500px" />;

重點是c站的代碼,以下所示:

<?php
if(strpos($_SERVER['HTTP_REFERER'], 'www.a.com')  !== false){
    //如下的寫法並不嚴謹,這裏只是作測試
    if(file_exists($_GET['fname'])){
        echo file_get_contents($_GET['fname']);
    }
}

這樣當a站訪問時圖片能夠正常顯示,而b站訪問時圖片是顯示不出來的。

PHP $_SERVER['HTTP_REFERER'] 無效

一般下面的一些方式,$_SERVER['HTTP_REFERER'] 會無效:

  1. 直接輸入網址訪問該網頁。
  2. Javascript 打開的網址。
  3. Javascript 重定向(window.location)網址。
  4. 使用 meta refresh 重定向的網址。
  5. 使用 PHP header 重定向的網址。
  6. flash 中的連接。
  7. 瀏覽器未加設置或被用戶修改。

因此通常來講,只有經過 <a></a> 超連接以及 POSTGET 表單訪問的頁面,$_SERVER['HTTP_REFERER'] 纔有效。

結論

遇到的這個問題,原本覺得是前端形成,代碼哪裏有問題,沒有給後端發送正確的來源。經過百度和查找PHP手冊發現,這個問題只能經過後端PHP修改。

HTTP_REFERER這個變量其實也是HTTP協議中相關知識。而後又由於不一樣的瀏覽器客戶端對請求頭處理規則不同,因此形成了這個問題。

也由於這個問題,補充了一個知識點,就是圖片防盜鏈的基本原理。因此遇到一個問題後,經過學習能夠補充很多相關聯的知識點。✌️


本文參考、翻譯瞭如下文章,並進行了整理。

參考連接:

相關文章
相關標籤/搜索