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 $_SERVER
superglobal 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
). ServerValidator
controlla 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 host
HTTP 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_POST
e INPUT_SERVER
per 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 host
un'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 ServerName
in httpd.conf e, per estensione, al valore per $_SERVER('SERVER_NAME')
nel $_SERVER
superglobal. Ancora una volta, userei INPUT_SERVER
con le funzioni del filtro PHP, ma tu catturi la mia deriva.
Tieni presente che Apache utilizza spesso ServerName
nei 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).