簡単な設定(CentOS 7、Apache 2.4.x、およびPHP 5.6.20)と、1つのWebサイト(仮想ホスティングを想定していない)のみがあると仮定します...
PHPの意味で$_SERVER['SERVER_NAME']
は、httpd.conf内の$_SERVER
Apache構成(を使用した**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']
値(要求されたhost
HTTPヘッダーから最終的に派生)がと一致することを確認します$_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')
$_SERVER
INPUT_SERVER
Apacheが頻繁に使用していることに注意してくださいServerName
に標準リダイレクト:(例、そのようなURLオフ最後のスラッシュを残すようhttp://www.foo.comになってきてhttp://www.foo.com/あなたがない場合でも、) URL書き換えを使用します。
私は$_SERVER['SERVER_NAME']
ではなく、標準として使用し$_SERVER['HTTP_HOST']
ます。この問題については、多くの点が前後しています。 $_SERVER['HTTP_HOST']
空である可能性があるため、これは上記の私のパブリックメソッドなどのコード規則を作成するための基礎にはなりません。しかし、両方が設定されているからといって、それらが等しいことを保証するものではありません。テストは確実に知る最良の方法です(ApacheバージョンとPHPバージョンを念頭に置いてください)。