2016-12-26 10 views
3

some-client.comからsome-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']'はあなたの解決策です.DNSでないIPを得ることができます – matiaslauriti

答えて

6

記事MDNによってHTTP access control (CORS)によると:

すべての要求は、CORSで正しくメカニズム(共有クロスオリジンリソース)を動作するようにOriginヘッダーを設定する必要があります。

起源」要求ヘッダはRFC 6454の一部であり、はCORS機構の一部としてそれを説明し、MDNに応じてすべてのブラウザと互換性があります。 MDNによって

説明:

由来フェッチここOriginリクエストヘッダが示します。 にはパス情報はなく、サーバー名のみが含まれています。 CORS要求とPOST要求とともに送信されるのは です。 Refererヘッダーには同様の がありますが、このヘッダーとは異なり、全体のパスは ではありません。

出典:MDNによってhttps://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin

例: enter image description here

だから、あなたが使用できるPHPでXHRリクエストの起源を取得する:

$_SERVER['HTTP_ORIGIN'] 

そして、直接の場合あなたはHTTP_REFERERなどREMOTE_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クライアントのためのユニークなものはパブリックIPだけです。しかし、これは、ISPのネットワークアドレス変換またはプロキシーを使用する多くのクライアントに対応しています。

すべてが相対的で境界内にあるため、CORSのようなメカニズムはHTTP Originヘッダー上に構築されます。クライアントは標準のブラウザを使用することを前提としています。

私の意見では、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

あなたの答えはあまりにも貧しく、私の質問に答えることはできません。 –

関連する問題