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 $_SERVER
superglobalu 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 host
nagłó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
). ServerValidator
sprawdza 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 host
nagłó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_POST
oraz INPUT_SERVER
w 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 host
nagłó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 ServerName
w httpd.conf , a za przedłużeniem, wartość $_SERVER('SERVER_NAME')
w $_SERVER
superglobalną. Znowu używałbym INPUT_SERVER
z funkcjami filtrowania PHP, ale łapiesz mój dryf.
Należy pamiętać, że Apache często używa ServerName
się 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).