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 $_SERVER
superglobal 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 host
header 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
). ServerValidator
memeriksa 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 host
tajuk 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_SERVER
dalam 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 host
header HTTP (keberadaan diuji sebelumnya) mantra malapetaka untuk browser HTTP 1.0 yang ketat . Selain itu, tuan rumah yang diminta harus sesuai nilai untuk ServerName
di httpd.conf , dan, dengan extention, nilai untuk $_SERVER('SERVER_NAME')
di $_SERVER
superglobal. Sekali lagi, saya akan menggunakan INPUT_SERVER
dengan fungsi filter PHP, tetapi Anda tahu maksud saya.
Perlu diingat bahwa Apache sering menggunakan ServerName
di 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).