Dengan asumsi seseorang memiliki pengaturan yang sederhana (CentOS 7, Apache 2.4.x, dan PHP 5.6.20) dan hanya satu situs web (tidak menggunakan hosting virtual) ...
Dalam pengertian PHP, $_SERVER['SERVER_NAME']adalah elemen register PHP di $_SERVERsuperglobal berdasarkan pada konfigurasi Apache Anda ( **ServerName**direktif dengan UseCanonicalName On) di httpd.conf (baik itu dari file konfigurasi host virtual yang disertakan, apa pun, dll ...). HTTP_HOST diturunkan dari hostheader HTTP . Perlakukan ini sebagai input pengguna. Saring dan validasi sebelum menggunakan.
Berikut adalah contoh tempat saya menggunakan $_SERVER['SERVER_NAME']sebagai dasar untuk perbandingan. Metode berikut ini dari kelas anak beton yang saya buat bernama ServerValidator(child of Validator). ServerValidatormemeriksa enam atau tujuh elemen dalam $ _SERVER sebelum menggunakannya.
Dalam menentukan apakah permintaan HTTP adalah POST, saya menggunakan metode ini.
public function isPOST()
{
return (($this->requestMethod === 'POST') && // Ignore
$this->hasTokenTimeLeft() && // Ignore
$this->hasSameGETandPOSTIdentities() && // Ingore
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')));
}
Pada saat metode ini dipanggil, semua pemfilteran dan validasi elemen $ _SERVER yang relevan akan terjadi (dan set properti yang relevan).
Garis ...
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')
... memeriksa apakah $_SERVER['HTTP_HOST']nilainya (akhirnya berasal dari hosttajuk HTTP yang diminta ) cocok $_SERVER['SERVER_NAME'].
Sekarang, saya menggunakan berbicara superglobal untuk menjelaskan contoh saya, tapi itu hanya karena beberapa orang tidak terbiasa dengan INPUT_GET, INPUT_POST, dan INPUT_SERVERdalam hal filter_input_array().
Intinya adalah, saya tidak menangani permintaan POST pada server saya kecuali semua empat kondisi terpenuhi. Oleh karena itu, dalam hal permintaan POST, kegagalan untuk menyediakan hostheader HTTP (keberadaan diuji sebelumnya) mantra malapetaka untuk browser HTTP 1.0 yang ketat . Selain itu, tuan rumah yang diminta harus sesuai nilai untuk ServerNamedi httpd.conf , dan, dengan extention, nilai untuk $_SERVER('SERVER_NAME')di $_SERVERsuperglobal. Sekali lagi, saya akan menggunakan INPUT_SERVERdengan fungsi filter PHP, tetapi Anda tahu maksud saya.
Perlu diingat bahwa Apache sering menggunakan ServerNamedi pengalihan standar (seperti meninggalkan garis miring off URL: Contoh, http://www.foo.com menjadi http://www.foo.com/ ), bahkan jika Anda tidak menggunakan penulisan ulang URL.
Saya menggunakan $_SERVER['SERVER_NAME']sebagai standar, bukan $_SERVER['HTTP_HOST']. Ada banyak bolak-balik tentang masalah ini. $_SERVER['HTTP_HOST']mungkin kosong, jadi ini seharusnya tidak menjadi dasar untuk membuat konvensi kode seperti metode publik saya di atas. Tapi, hanya karena keduanya dapat diatur tidak menjamin mereka akan sama. Pengujian adalah cara terbaik untuk mengetahui dengan pasti (mengingat versi Apache dan versi PHP).