2016-12-26 51 views
3

如果有人發送從some-client.comsome-rest.com的XHR請求,我想要使用PHP獲取請求的來源(域名,而不是客戶端ip)。如何使用PHP獲取請求的來源?

可能的解決方案:

  • 也許我可以用$_SERVER['HTTP_ORIGIN']但我不知道這是否是一個標準。
  • 我看到另一個標題,如$_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME'],但有些情況下返回的是真實的hostname而不是真正的domain
  • $_SERVER['REMOTE_ADDR']給出了客戶端IP。

什麼是正確的方式來獲取請求的起源像一個域名與PHP?

謝謝!

+1

從我所知道的,'$ _SERVER ['REMOTE_ADDR']'是你的解決方案,你只能得到IP而不是DNS – matiaslauriti

回答

6

根據文章HTTP access control (CORS)由MDN:

所有請求都必須設置Origin頭CORS下正常工作(跨來源資源共享)機制。

的「起源」請求頭是RFC 6454部分和把它描述爲的CORS機構部分,並與根據MDN所有瀏覽器兼容。

說明通過MDN:

Origin請求報頭指示其中從取起源。它 不包含任何路徑信息,但只包含服務器名稱。這是與CORS請求一起發送的 以及POST請求。它類似於 到Referer頭部,但是,不像這個頭部,它沒有透露 整個路徑。

來源:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin

例由MDN: enter image description here

因此,要獲得XHR請求的起源與PHP,你可以使用:

$_SERVER['HTTP_ORIGIN'] 

而且,在直接的情況下要求,你可以結合HTTP_REFERERREMOTE_ADDR,如:

if (array_key_exists('HTTP_REFERER', $_SERVER)) { 
    $origin = $_SERVER['HTTP_REFERER']; 
} else { 
    $origin = $_SERVER['REMOTE_ADDR']; 
} 

因此,可能最終的解決方案是:

if (array_key_exists('HTTP_ORIGIN', $_SERVER)) { 
    $origin = $_SERVER['HTTP_ORIGIN']; 
} 
else if (array_key_exists('HTTP_REFERER', $_SERVER)) { 
    $origin = $_SERVER['HTTP_REFERER']; 
} else { 
    $origin = $_SERVER['REMOTE_ADDR']; 
} 

MDN是Mozilla Developer Network

非常感謝@trine,@ waseem-bashir,@ p0lt10n和其他人。

1

在PHP中,您可以使用$ _SERVER ['HTTP_REFERER']。 如果您使用codeigniter,那麼您可以使用$ this-> agent-> is_referral()來獲取引用。

+0

這是'Referer''頭,一些瀏覽器不使用這個頭。在這裏瞭解更多:en.wikipedia.org/wiki/HTTP_referer –

1
$_SERVER['HTTP_ORIGIN'] // HTTP Origin header 
$_SERVER['HTTP_HOST'] // HTTP Host header 
$_SERVER['HTTP_REFERER'] // HTTP Referer header 
$_SERVER['REMOTE_ADDR'] // HTTP Client's Public IP 

我們先來討論一下$_SERVER的參數。

首先,XHR位於客戶端,它與http客戶端綁定。由於Origin和Referer頭文件不是強制性的,除標準Web瀏覽器之外的客戶端不會設置它。下一個主機頭可能不是強制性的。如果您的REST服務器使用虛擬主機,則此頭是正確路由請求的必備條件。但是這個頭文件沒有關於客戶端的任何細節。對於http客戶端唯一的東西是Public IP。但是,這對應於許多客戶作爲ISP的使用網絡地址轉換或代理。

因爲一切都是相對的並且在範圍內,所以類似於HTTP Origin機制的CORS。假設客戶並建議使用標準瀏覽器。

就你的情況而言,我認爲可以依賴Origin頭文件。如果它適合你,你可以實現CORS機制。

-1

請在您的網絡服務器上試試這段代碼。

<?php 
if($_SERVER["HTTP_REFERER"]){ 
$path = $_SERVER["REQUEST_URI"]; 
echo $_SERVER["HTTP_REFERER"].$path; 
exit(); 
} 
?> 
<script> 
function func1(){ 
$.post("<?php echo basename($_SERVER["SCRIPT_FILENAME"], '.php').".php"; ?>", {}, function(data) { 
/*--------------------this data variable is your answer, use it wherever you want-----------*/ 
document.write(data); 
}); 
} 
window.onload=func1(); 
</script> 
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
+0

你的回答太差,不回答我的問題。 –