簡體   English   中英

$_SERVER['DOCUMENT_ROOT'] 和 $_SERVER['HTTP_HOST'] 的區別

[英]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 旨在擴展並提供有關似乎是原始海報內部關注點的其他信息:

  • 在哪里使用基於URL的位置有意義: $_SERVER['HTTP_HOST']
  • 在哪里使用基於本地的位置有意義: $_SERVER['DOCUMENT_ROOT']
  • 兩者都可以使用的地方,每一種的優點和缺點是什么。 ?

跟隨我的 awnsers:

  • 通過使用HTTP_HOST,您可以將自己從機器文件夾系統中抽象出來,這意味着在考慮可移植性的情況下,您需要在可能具有不同操作系統的多台服務器上安裝應用程序,這種方法可能更容易維護。
  • 如果您的服務器將變得不可用,並且您想要一個與集群不同的服務器來處理請求,您也可以利用HTTP_HOST
  • 通過使用DOCUMENT_ROOT,您可以訪問整個文件系統(取決於您授予 php 的權限),如果您想訪問不想從網絡訪問的程序或文件夾系統與您的應用程序相關時,這是有意義的.
  • 您還可以利用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM