$_SERVER['HTTP_HOST'] vs $_SERVER['SERVER_NAME'] trong PHP

Cập nhật ngày 25/04/2024
Lượt xem: 32

Giải thích đơn giản

Nếu máy chủ chạy trên một cổng khác 80 thì sẽ HTTP_HOST chứa cổng, trong khi SERVER_NAME thì không.

$_SERVER['HTTP_HOST'] == 'localhost:8080'
$_SERVER['SERVER_NAME'] == 'localhost'

HTTP_HOST không không chứa :443 khi chạy trên HTTPS (trừ khi bạn đang chạy trên một cổng không chuẩn)

Chỉ khi bạn buộc Apache sử dụng tên chuẩn, bạn sẽ luôn nhận được tên máy chủ phù hợp SERVER_NAME Vì vậy, với điều đó hoặc bạn kiểm tra tên máy chủ trong danh sách trắng:

$allowed_hosts = array('foo.example.com', 'bar.example.com');

if (!isset($_SERVER['HTTP_HOST']) || !in_array($_SERVER['HTTP_HOST'], $allowed_hosts)) {
    header($_SERVER['SERVER_PROTOCOL'].' 400 Bad Request');
    exit;
}