[英]What is the difference between HTTP_HOST and SERVER_NAME in PHP?
[英]Difference between $_SERVER['DOCUMENT_ROOT'] and $_SERVER['HTTP_HOST']
我回來了一個簡單的問題(或相關問題)。
問題很簡單,但我還沒有收到答案。 我問過很多在 PHP 方面有不同經驗的人。 但我得到的回應是:“我不知道。我從來沒有想過這個。” 使用谷歌我無法找到任何關於此的文章。 希望在這里能得到滿意的答復。
所以問題是:
$_SERVER['DOCUMENT_ROOT']
和$_SERVER['HTTP_HOST']
什么區別?
一個比另一個有什么優勢嗎?
我們應該在哪里使用 HTTP_HOST 以及在哪里使用 DOCUMENT_ROOT?
DOCUMENT_ROOT
該站點的根目錄由“通用部分”中的“DocumentRoot”指令定義或某個部分,例如
DOCUMENT_ROOT=/var/www/example
HTTP_HOST
主機的基本 URL,例如
HTTP_HOST=www.example.com
文檔根目錄是您網站的本地路徑,位於您的服務器上; http 主機是服務器的主機名。 它們相當不同; 也許你可以澄清你的問題?
編輯:你說:
案例 1 : header('Location: '.$_SERVER['DOCUMENT_ROOT'] .'/abc.php')
案例2:header('位置:'。$_SERVER['HTTP_HOST'] .'/abc.php')
我懷疑只有當您在提供頁面服務的同一台機器上運行瀏覽器時,第一個才會起作用。
想象一下,如果其他人使用他們的 Windows 機器訪問您的網站。 你的網絡服務器在 HTTP 標頭中告訴他們,“嘿,實際上,重定向這個位置:/var/www/example/abc.php。” 你希望用戶的機器做什么?
現在,如果你在談論類似的事情
<?php include($_SERVER['DOCUMENT_ROOT'] . '/include/abc.php') ?>
對比
<?php include($_SERVER['HTTP_HOST'] . '/include/abc.php') ?>
這可能是有道理的。 我懷疑在這種情況下,前者可能更受歡迎,盡管我不是 PHP 大師。
呃,有什么問題嗎? DOCUMENT_ROOT
包含當前網站的路徑,在我的例子中是/home/www
。 HTTP_HOST
包含testing.local
,因為它在本地域上運行。 區別很明顯,不是嗎?
我不知道你在哪里可以互換這兩個,所以你為什么要考慮優勢?
HTTP_HOST
會給你主機的 URL,例如domain.com
DOCUMENT_ROOT
將為您提供服務器文件系統中網站文檔根目錄的絕對路徑,例如/var/www/domain/
順便說一句,你有沒有試過查看 PHP 的手冊,特別是$_SERVER
? 一切都在那里解釋。
<?php include($_SERVER['DOCUMENT_ROOT'] . '/include/abc.php') ?>
應該用於將文件包含在另一個文件中。
header('Location: '. $_SERVER['HTTP_HOST'] . '/abc.php')
應該用於超鏈接
如果你想要像'example.com'這樣的域路徑,你可以使用“HTTP_HOST”如果你想要文件夾'/public_html/foldername/'路徑你可以使用“DOCUMENT_ROOT”
$_SERVER ['HTTP_HOST']
返回域名 url ag www.example.com 而$_SERVER['DOCUMENT_ROOT']
返回當前網站的屋頂.. 如
$_SERVER ['HTTP_HOST']
由客戶端定義,甚至可能沒有設置! 您可以重復請求並保留用於在開發工具(例如 Waterfox/Firefox)中進行本地測試的標頭。 您必須確定此標頭是否已設置以及被請求的主機是否存在(您要做的第一件事之一,甚至在開始發送任何標頭之前),否則適當的操作是終止整個進程並使用HTTP 400 Bad Request
響應HTTP 400 Bad Request
。 這適用於所有服務器端編程語言。
$_SERVER['DOCUMENT_ROOT']
由服務器定義為執行腳本所在的目錄。 例子:
public_html/example.php
= public_html/
public_html/test1/example.php
= public_html/test1/
請記住,如果您使用 Apache 重寫,則$_SERVER['REQUEST_URI']
(請求的 URL)和$_SERVER['PHP_SELF']
(處理請求的文件)之間存在差異。
約翰·萊德貝特 (John Ledbetter) 完美地解決了標題問題。
此 awnser 旨在擴展並提供有關似乎是原始海報內部關注點的其他信息:
跟隨我的 awnsers:
您還可以利用DOCUMENT_ROOT來獲取子站點根而不是主機。
$_SERVER['HTTP_HOST'] = "www.example.com"; $_SERVER['DOCUMENT_ROOT'] = "var/www/domain/subsite1" // equivalent to www.example.com/subsite1
其他答案也提到了它,但我想添加一個答案,只是為了在某一點上像灰熊一樣鋒利 - 不要相信$_SERVER['HTTP_HOST']
在以下代碼中是安全的:
<?php
header('Location: '. $_SERVER['HTTP_HOST'] . '/abc.php');
#Or
include($_SERVER['HTTP_HOST'] . '/include/abc.php');
?>
該變量受傳入請求的操縱,並可能導致漏洞利用。 這可能取決於您的服務器配置,但您不希望為您填寫此變量:)
也可以看看:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.