簡単な設定(CentOS 7、Apache 2.4.x、およびPHP 5.6.20)と、1つのWebサイト(仮想ホスティングを想定していない)のみがあると仮定します...
PHPの意味で$_SERVER['SERVER_NAME']は、httpd.conf内の$_SERVERApache構成(を使用した**ServerName**ディレクティブUseCanonicalName On)に基づいて、PHPがスーパーグローバルに登録する要素です(含まれている仮想ホスト構成ファイルなどから)。HTTP_HOSTは、HTTP hostヘッダーから派生します。これをユーザー入力として扱います。使用する前にフィルタリングして検証します。
$_SERVER['SERVER_NAME']これは、比較の基準として使用する場所の例です。次のメソッドは、私が名前を付けた具体的な子クラスからのものですServerValidator(の子Validator)。ServerValidator$ _SERVERの6つまたは7つの要素を使用する前にチェックします。
HTTPリクエストがPOSTであるかどうかを判断するには、この方法を使用します。
public function isPOST()
{
return (($this->requestMethod === 'POST') && // Ignore
$this->hasTokenTimeLeft() && // Ignore
$this->hasSameGETandPOSTIdentities() && // Ingore
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')));
}
このメソッドが呼び出されるときまでに、関連する$ _SERVER要素(および関連するプロパティセット)のすべてのフィルタリングと検証が行われているはずです。
この線 ...
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')
... $_SERVER['HTTP_HOST']値(要求されたhostHTTPヘッダーから最終的に派生)がと一致することを確認します$_SERVER['SERVER_NAME']。
今、私は私の例を説明するためにスーパーグローバル話すを使用していますが、それは一部の人々はに慣れていないという理由だけでINPUT_GET、INPUT_POSTとINPUT_SERVERの点でへfilter_input_array()。
要するに、4つの条件がすべて満たされない限り、サーバーでPOST要求を処理しません。したがって、POSTリクエストに関して、厳密なHTTP 1.0ブラウザーでは、HTTP hostヘッダー(以前にテストされた存在についてテスト済み)の提供に失敗すると運命を破ります。また、要求されたホストは、値が一致しなければならないためにhttpd.confのため、拡張子によって、値を、およびでスーパーグローバル。繰り返しますが、私はPHPフィルター関数を使用していますが、私のドリフトをキャッチします。ServerName$_SERVER('SERVER_NAME')$_SERVERINPUT_SERVER
Apacheが頻繁に使用していることに注意してくださいServerNameに標準リダイレクト:(例、そのようなURLオフ最後のスラッシュを残すようhttp://www.foo.comになってきてhttp://www.foo.com/あなたがない場合でも、) URL書き換えを使用します。
私は$_SERVER['SERVER_NAME']ではなく、標準として使用し$_SERVER['HTTP_HOST']ます。この問題については、多くの点が前後しています。 $_SERVER['HTTP_HOST']空である可能性があるため、これは上記の私のパブリックメソッドなどのコード規則を作成するための基礎にはなりません。しかし、両方が設定されているからといって、それらが等しいことを保証するものではありません。テストは確実に知る最良の方法です(ApacheバージョンとPHPバージョンを念頭に置いてください)。