Zakładając, że masz prostą konfigurację (CentOS 7, Apache 2.4.x i PHP 5.6.20) i tylko jedną stronę internetową (nie zakładając wirtualnego hostingu) ...
W sensie PHP $_SERVER['SERVER_NAME']jest elementem, który PHP rejestruje w $_SERVERsuperglobalu na podstawie konfiguracji Apache ( **ServerName**dyrektywy z UseCanonicalName On) w httpd.conf (czy to z dołączonego pliku konfiguracji hosta wirtualnego, cokolwiek, itp.). HTTP_HOST pochodzi z hostnagłówka HTTP . Traktuj to jako dane wprowadzone przez użytkownika. Filtruj i sprawdzaj przed użyciem.
Oto przykład, w którym wykorzystuję $_SERVER['SERVER_NAME']jako podstawę porównania. Poniższa metoda pochodzi z konkretnej klasy potomnej, którą nazwałem ServerValidator(child of Validator). ServerValidatorsprawdza sześć lub siedem elementów w $ _SERVER przed ich użyciem.
Przy określaniu, czy żądanie HTTP jest POST, używam tej metody.
public function isPOST()
{
return (($this->requestMethod === 'POST') && // Ignore
$this->hasTokenTimeLeft() && // Ignore
$this->hasSameGETandPOSTIdentities() && // Ingore
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')));
}
Do czasu wywołania tej metody nastąpiłoby całe filtrowanie i sprawdzanie poprawności odpowiednich elementów $ _SERVER (i odpowiednich właściwości).
Linia ...
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')
... sprawdza, czy $_SERVER['HTTP_HOST']wartość (ostatecznie uzyskana z żądanego hostnagłówka HTTP) jest zgodna $_SERVER['SERVER_NAME'].
Teraz używam superglobalną mówić wyjaśnić moim przykładem, ale to tylko dlatego, że niektórzy ludzie nie znają INPUT_GET, INPUT_POSToraz INPUT_SERVERw odniesieniu do filter_input_array().
Najważniejsze jest to, że nie obsługuję żądań POST na moim serwerze, chyba że zostaną spełnione wszystkie cztery warunki. W związku z tym, jeśli chodzi o żądania POST, brak dostarczenia hostnagłówka HTTP (przetestowanego pod kątem obecności wcześniej) oznacza zgubę dla ścisłych przeglądarek HTTP 1.0 . Ponadto zwróciła gospodarz musi odpowiadać wartości dla ServerNamew httpd.conf , a za przedłużeniem, wartość $_SERVER('SERVER_NAME')w $_SERVERsuperglobalną. Znowu używałbym INPUT_SERVERz funkcjami filtrowania PHP, ale łapiesz mój dryf.
Należy pamiętać, że Apache często używa ServerNamesię standardowych przekierowań (takie jak pozostawiając ukośnik off URL: przykład http://www.foo.com staje http://www.foo.com/ ), nawet jeśli nie są za pomocą przepisywania adresów URL.
Używam $_SERVER['SERVER_NAME']jako standardu, nie $_SERVER['HTTP_HOST']. W tej kwestii jest wiele do przodu i do tyłu. $_SERVER['HTTP_HOST']może być pusty, więc nie powinno to stanowić podstawy do tworzenia konwencji kodu, takich jak powyższa metoda publiczna. Ale tylko dlatego, że oba mogą być ustawione, nie gwarantuje, że będą równe. Testowanie jest najlepszym sposobem, aby wiedzieć na pewno (mając na uwadze wersję Apache i wersję PHP).