2012-12-08 35 views

Trả lời

21

$_SERVER['SERVER_NAME'] cho giá trị của tên máy chủ theo quy định tại cấu hình máy chủ (nghĩa là cho Apache Apache conf tập tin).

$_SERVER['HTTP_HOST'] cung cấp cho bạn tên miền mà yêu cầu hiện tại đang được thực hiện và có liên quan trực tiếp hơn đến yêu cầu.

HTTP_HOST thường hữu ích hơn trong hầu hết các ứng dụng liên quan đến yêu cầu, trong khi SERVER_NAME có thể trả lại bất kỳ giá trị nào trong tệp conf và không cho bạn biết bất kỳ điều gì về yêu cầu.

Tôi sẽ cung cấp cho bạn một ví dụ về cách HTTP_HOST có thể khác với SERVER_NAME. Giả sử bạn có một máy chủ được xác định trong Apache với Tên máy chủ là domain.com và địa chỉ IP là 1.2.3.4.

Hãy nhìn vào hai yêu cầu URL đến và thấy sự khác biệt giữa các biến:

http://www.domain.com 
HTTP_HOST = www.domain.com 
SERVER_NAME = domain.com 

http://1.2.3.4 
HTTP_HOST = 1.2.3.4 
SERVER_NAME = domain.com 

Vì vậy, một lần nữa, HTTP_HOST được gắn hơn với yêu cầu, trong khi SERVER_NAME được xác định bởi cấu hình máy chủ.

+0

$ _SERVER ['HTTP_HOST'] "cung cấp cho bạn tên miền mà yêu cầu hiện tại đang được thực hiện và nó liên quan nhiều hơn đến yêu cầu." +1 THANKS !!!! Và nhờ những người liên kết với tài liệu chính thức, nhưng quá phức tạp đối với tôi;) – Eman

+0

@ Tương tự, không chỉ 'SERVER_NAME' phụ thuộc vào cấu hình máy chủ. ['HTTP_HOST' cũng phụ thuộc vào nó.] (Http://stackoverflow.com/a/28889208/632951) – Pacerier

1

HTTP_HOST là tiêu đề Host: do khách hàng gửi. Kết quả là, nó có thể là một chút ít đáng tin cậy hơn. SERVER_NAME được xác định bởi cấu hình máy chủ của bạn , bất kể nhập của người dùng.

Sự khác biệt về hành vi là tinh tế. Một số ví dụ tốt được thể hiện ở đây: http://shiflett.org/blog/2006/mar/server-name-versus-http-host

The docs explain this well

'SERVER_NAME' Tên của server host theo đó kịch bản hiện nay đang thực hiện. Nếu tập lệnh đang chạy trên máy chủ ảo, đây sẽ là giá trị được xác định cho máy chủ ảo đó.

'HTTP_HOST' Nội dung của Máy chủ: tiêu đề từ yêu cầu hiện tại, nếu có.

+0

Kết luận của bạn sai. 'SERVER_NAME' được xác định bởi cấu hình máy chủ của bạn và [có thể được thực hiện (thực sự * đó là * hành vi mặc định) để phụ thuộc] (http://stackoverflow.com/a/28889208/632951) trên đầu vào của người dùng. – Pacerier

+0

Một ví dụ điển hình về sự tinh tế của HTTP_HOST so với SERVER_NAME được thể hiện ở đây: http://shiflett.org/blog/2006/mar/server-name-versus-http-host –

+0

Vâng, nó giống với một ví dụ từ http: // stackoverflow .com/a/1459794/632951. 'SERVER_NAME' được xác định bởi cấu hình của máy chủ và có thể được thực hiện tùy thuộc vào đầu vào của người dùng. – Pacerier

0

HTTP_HOST

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

SERVER_NAME

Tên của server host theo đó kịch bản hiện nay đang thực hiện. Nếu tập lệnh đang chạy trên máy chủ ảo, đây sẽ là giá trị được xác định cho máy chủ ảo đó.

http://php.net/manual/en/reserved.variables.server.php

+0

Tất nhiên đầu ra không giống nhau ........ – Pacerier

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