2012-06-06 33 views
7

Biến máy chủ HTTP_HOST luôn được định nghĩa cho tất cả các máy chủ hay ví dụ trong IIS được xác định với tên khác hoặc thậm chí không được xác định?Biến máy chủ HTTP_HOST có luôn được xác định không?

Ngoài ra, giá trị đó luôn được xác định? Hoặc một số máy chủ họ không xác định giá trị đó? Có cách nào khác để lấy lại giá trị đó không?

Trả lời

7

Trích dẫn hướng dẫn

HTTP_HOST là

Contents of the Host: header from the current request, if there is one.

HTTP_HOST là một phần của yêu cầu HTTP của khách hàng và quy định cụ thể mà chủ tên theo yêu cầu sẽ được hướng đến. nếu HTTP_HOST không được đặt, máy khách hoặc là rất, rất cũ (HTTP 1.0 không hỗ trợ HTTP_HOST) hoặc đã thực hiện yêu cầu trực tiếp đến IP của trang web của bạn.

Tôi cho rằng Tiêu đề máy chủ HTTP là bắt buộc vì HTTP 1.1

+0

Bạn có biết trong hầu hết trường hợp, $ _SERVER ['HTTP_HOST'] sẽ hoạt động không? Bởi vì tôi tạo một kịch bản để được chia sẻ như một tài nguyên miễn phí và sẽ được cài đặt trong nhiều máy chủ khác nhau –

+0

Bạn đá ... nghiêm túc tôi không thể tìm thấy một câu trả lời đơn giản như thế này ở bất cứ đâu. Những gì bạn đề nghị để đọc để hiểu giải phẫu của http-yêu cầu/tiêu đề ... vv? –

+0

"** hoặc ** đã gửi yêu cầu trực tiếp đến IP của trang web của bạn" - Điều này không nhất thiết có nghĩa là tiêu đề 'Host:' không được đặt - nó có thể chỉ được đặt thành địa chỉ IP. – MrWhite

2

HTTP_HOST không được xác định bởi máy chủ, nó

Nội dung Host: tiêu đề từ các yêu cầu hiện tại, nếu có một.

Vì vậy, tùy thuộc vào việc thông tin tiêu đề của yêu cầu của bạn có chứa Host hay không.

+0

Vì vậy, câu hỏi tiếp theo, là một cách để có được luôn luôn là một giá trị indentical để HTTP_HOST? –

+2

Trên IIS, bạn có thể sử dụng SERVER_NAME làm dự phòng. Trên Apache cùng một biến có thể hoặc không có sẵn (xem ['ServerName'] (http://httpd.apache.org/docs/2.0/mod/core.html#servername) chỉ thị trong httpd.conf). –

2

Nó không phải lúc nào cũng được xác định.

Như được trích dẫn ở trên, nó chỉ được xác định nếu có yêu cầu http. Nếu bạn đang chạy tập lệnh php từ CLI (ví dụ: php filename.php), khóa HTTP_HOST sẽ không được đặt.

Hơn nữa, bạn nên lưu ý rằng HTTP_HOST được xác định bởi ứng dụng khách, do đó rất dễ giả mạo và không đáng tin cậy. Bạn nên dựa vào một cái gì đó như SERVER_NAME.

Nếu bạn đang sử dụng PHP> = 5.3.0 thì bạn nên sử dụng

gethostname(); 

Bạn có thể kiểm tra here cho tài liệu.

Nếu bạn đang sử dụng PHP> = 4.2.0 & PHP < 5.3.0 sau đó

php_uname('n'); 

sẽ làm công việc tương tự.

+0

'gethostname()' trả về "tên máy chủ cho máy cục bộ" mà không nhất thiết phải là thứ tương tự nếu không được trả về từ 'HTTP_HOST' - đặc biệt nếu cùng một máy đang phục vụ nhiều trang. "' get_uname ('n') '" phải là 'php_uname ('n')'. – MrWhite

Các vấn đề liên quan