Supondo que um tenha uma configuração simples (CentOS 7, Apache 2.4.xe PHP 5.6.20) e apenas um site (não assumindo hospedagem virtual) ...
No sentido PHP, $_SERVER['SERVER_NAME']
é um elemento que o PHP registra no $_SERVER
superglobal com base na sua configuração do Apache ( **ServerName**
diretiva com UseCanonicalName On
) no httpd.conf (seja de um arquivo de configuração do host virtual incluído, o que seja, etc ...). HTTP_HOST é derivado do HTTPhost
cabeçalho . Trate isso como entrada do usuário. Filtre e valide antes de usar.
Aqui está um exemplo de onde eu uso $_SERVER['SERVER_NAME']
como base para uma comparação. O método a seguir é de uma classe filho concreta que eu criei chamada ServerValidator
(filho de Validator
). ServerValidator
verifica seis ou sete elementos em $ _SERVER antes de usá-los.
Para determinar se a solicitação HTTP é POST, eu uso esse método.
public function isPOST()
{
return (($this->requestMethod === 'POST') && // Ignore
$this->hasTokenTimeLeft() && // Ignore
$this->hasSameGETandPOSTIdentities() && // Ingore
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')));
}
Quando esse método é chamado, toda a filtragem e validação dos elementos $ _SERVER relevantes já teriam ocorrido (e as propriedades relevantes foram definidas).
A linha ...
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')
... verifica se o $_SERVER['HTTP_HOST']
valor (finalmente derivado do host
cabeçalho HTTP solicitado ) corresponde $_SERVER['SERVER_NAME']
.
Agora, eu estou usando falar superglobal para explicar o meu exemplo, mas isso é apenas porque algumas pessoas não estão familiarizados com INPUT_GET
, INPUT_POST
e INPUT_SERVER
no que diz respeito a filter_input_array()
.
A conclusão é que não lida com solicitações POST no meu servidor, a menos que todas as quatro condições sejam atendidas. Por isso, em termos de solicitações POST, a incapacidade de fornecer um HTTP host
cabeçalho (presença testado para anteriores) períodos DooM para rigorosas HTTP 1.0 navegadores. Além disso, o anfitrião solicitado deve corresponder ao valor de ServerName
no httpd.conf , e, por extensão, o valor para $_SERVER('SERVER_NAME')
no $_SERVER
superglobal. Mais uma vez, eu usaria INPUT_SERVER
com as funções de filtro PHP, mas você entendeu a minha deriva.
Lembre-se de que o Apache costuma usar ServerName
em redirecionamentos padrão (como deixar a barra à direita de uma URL: exemplo, http://www.foo.com se torna http://www.foo.com/ ), mesmo que você não esteja usando a reescrita de URL.
Eu uso $_SERVER['SERVER_NAME']
como padrão, não $_SERVER['HTTP_HOST']
. Há muitas discussões sobre esse assunto. $_SERVER['HTTP_HOST']
pode estar vazio, portanto, essa não deve ser a base para a criação de convenções de código, como meu método público acima. Mas, apenas porque ambos podem ser definidos, não garante que serão iguais. Testar é a melhor maneira de ter certeza (tendo em mente a versão Apache e a versão PHP).