Supponendo che uno abbia una configurazione semplice (CentOS 7, Apache 2.4.xe PHP 5.6.20) e un solo sito Web (non assumendo l'hosting virtuale) ...
In senso PHP, $_SERVER['SERVER_NAME']è un elemento che PHP registra nel $_SERVERsuperglobal in base alla configurazione di Apache ( **ServerName**direttiva con UseCanonicalName On) in httpd.conf (sia esso da un file di configurazione dell'host virtuale incluso, qualunque cosa, ecc ...). HTTP_HOST è derivato dall'intestazione HTTP host. Considera questo come input dell'utente. Filtra e convalida prima dell'uso.
Ecco un esempio di dove uso $_SERVER['SERVER_NAME']come base per un confronto. Il seguente metodo proviene da una classe figlio concreta che ho nominato ServerValidator(figlio di Validator). ServerValidatorcontrolla sei o sette elementi in $ _SERVER prima di usarli.
Nel determinare se la richiesta HTTP è POST, utilizzo questo metodo.
public function isPOST()
{
return (($this->requestMethod === 'POST') && // Ignore
$this->hasTokenTimeLeft() && // Ignore
$this->hasSameGETandPOSTIdentities() && // Ingore
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')));
}
Quando viene chiamato questo metodo, si sarebbero verificati tutti i filtri e la convalida dei relativi elementi $ _SERVER (e le relative proprietà impostate).
La linea ...
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')
... verifica che il $_SERVER['HTTP_HOST']valore (alla fine derivato dall'intestazione hostHTTP richiesta ) corrisponda $_SERVER['SERVER_NAME'].
Ora, io sto usando parlare superglobale di spiegare il mio esempio, ma che è solo perché alcune persone non hanno familiarità con INPUT_GET, INPUT_POSTe INPUT_SERVERper quanto riguarda filter_input_array().
La linea di fondo è che non gestisco le richieste POST sul mio server a meno che non siano soddisfatte tutte e quattro le condizioni. Quindi, in termini di richieste POST, la mancata fornitura di hostun'intestazione HTTP (presenza verificata per precedenti) indica un destino per i browser HTTP 1.0 rigidi . Inoltre, l'host richiesto deve corrispondere al valore per ServerNamein httpd.conf e, per estensione, al valore per $_SERVER('SERVER_NAME')nel $_SERVERsuperglobal. Ancora una volta, userei INPUT_SERVERcon le funzioni del filtro PHP, ma tu catturi la mia deriva.
Tieni presente che Apache utilizza spesso ServerNamenei reindirizzamenti standard (come lasciare la barra finale da un URL: Esempio, http://www.foo.com che diventa http://www.foo.com/ ), anche se non lo sei usando la riscrittura degli URL.
Uso $_SERVER['SERVER_NAME']lo standard, no $_SERVER['HTTP_HOST']. C'è molto avanti e indietro su questo problema. $_SERVER['HTTP_HOST']potrebbe essere vuoto, quindi questa non dovrebbe essere la base per la creazione di convenzioni di codice come il mio metodo pubblico sopra. Ma solo perché entrambi possono essere impostati non garantisce che saranno uguali. Il test è il modo migliore per saperlo con certezza (tenendo presente la versione di Apache e la versione di PHP).