Giả sử một người có một thiết lập đơn giản (CentOS 7, Apache 2.4.x và PHP 5.6.20) và chỉ có một trang web (không giả sử lưu trữ ảo) ...
Theo nghĩa của PHP, $_SERVER['SERVER_NAME']
là một phần tử mà các thanh ghi PHP trong siêu lớp $_SERVER
dựa trên cấu hình Apache của bạn ( **ServerName**
chỉ thị với UseCanonicalName On
) trong httpd.conf (có thể là từ tệp cấu hình máy chủ ảo được bao gồm, bất cứ điều gì, v.v.). HTTP_HOST có nguồn gốc từ host
tiêu đề HTTP . Coi đây là đầu vào của người dùng Lọc và xác nhận trước khi sử dụng.
Dưới đây là một ví dụ về nơi tôi sử dụng $_SERVER['SERVER_NAME']
làm cơ sở để so sánh. Phương pháp sau đây là từ một lớp con cụ thể mà tôi đã đặt tên ServerValidator
(con của Validator
). ServerValidator
kiểm tra sáu hoặc bảy yếu tố trong $ _SERVER trước khi sử dụng chúng.
Để xác định xem yêu cầu HTTP có phải là POST không, tôi sử dụng phương thức này.
public function isPOST()
{
return (($this->requestMethod === 'POST') && // Ignore
$this->hasTokenTimeLeft() && // Ignore
$this->hasSameGETandPOSTIdentities() && // Ingore
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')));
}
Vào thời điểm phương thức này được gọi, tất cả việc lọc và xác thực các phần tử $ _SERVER có liên quan sẽ xảy ra (và các thuộc tính có liên quan được đặt).
Dòng ...
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')
... Kiểm tra xem $_SERVER['HTTP_HOST']
giá trị (cuối cùng xuất phát từ host
tiêu đề HTTP được yêu cầu ) khớp với $_SERVER['SERVER_NAME']
.
Bây giờ, tôi đang sử dụng speak superglobal để giải thích ví dụ của tôi, nhưng đó chỉ là vì một số người không quen với INPUT_GET
, INPUT_POST
và INPUT_SERVER
liên quan đến filter_input_array()
.
Điểm mấu chốt là, tôi không xử lý các yêu cầu POST trên máy chủ của mình trừ khi tất cả bốn điều kiện được đáp ứng. Do đó, về mặt yêu cầu POST, thất bại trong việc cung cấp một HTTP host
header (hiện diện kiểm tra trước đó) phép thuật Doom cho nghiêm ngặt HTTP 1.0 trình duyệt. Hơn nữa, các máy chủ yêu cầu phải phù hợp với giá trị cho ServerName
trong httpd.conf , và, bằng cách gia hạn, giá trị cho $_SERVER('SERVER_NAME')
trong $_SERVER
superglobal. Một lần nữa, tôi sẽ sử dụng INPUT_SERVER
với các hàm bộ lọc PHP, nhưng bạn bắt được sự trôi dạt của tôi.
Hãy nhớ rằng Apache thường xuyên sử dụng ServerName
trong các chuyển hướng tiêu chuẩn (chẳng hạn như bỏ dấu gạch chéo ra khỏi một URL: Ví dụ, http://www.foo.com trở thành http://www.foo.com/ ), ngay cả khi bạn không sử dụng viết lại URL.
Tôi sử dụng $_SERVER['SERVER_NAME']
như là tiêu chuẩn, không $_SERVER['HTTP_HOST']
. Có rất nhiều vấn đề qua lại về vấn đề này. $_SERVER['HTTP_HOST']
có thể trống, vì vậy đây không phải là cơ sở để tạo các quy ước mã như phương thức công khai của tôi ở trên. Nhưng, chỉ vì cả hai có thể được đặt không đảm bảo chúng sẽ bằng nhau. Kiểm tra là cách tốt nhất để biết chắc chắn (ghi nhớ phiên bản Apache và phiên bản PHP).