$ _SERVER ['DOCUMENT_ROOT']和$ _SERVER ['HTTP_HOST']之间的区别

时间:2011-08-29 12:02:08

标签: php

我回答了一个简单的问题(或相关问题)。

问题很简单,但我还没有收到答案。我问过很多人在PHP方面有不同的经验。但我得到的回应是:“我什么都不知道。我从来没有想过这个。”使用Google我无法找到任何关于此的文章。我希望我能在这里得到满意的答案。

所以问题是:

$_SERVER['DOCUMENT_ROOT']$_SERVER['HTTP_HOST']之间的区别是什么?

一个人有什么优势吗?

我们应该在哪里使用HTTP_HOST&在哪里使用DOCUMENT_ROOT?

9 个答案:

答案 0 :(得分:29)

  

<强> DOCUMENT_ROOT

     

此站点的根目录由“常规”部分中的“DocumentRoot”指令或例如

部分定义。
DOCUMENT_ROOT=/var/www/example 
  

<强> HTTP_HOST

     

主机的基本URL,例如

HTTP_HOST=www.example.com 

文档根目录是您服务器上网站的本地路径; http主机是服务器的主机名。他们是相当不同的;也许你可以澄清你的问题?

修改: 你说:

  

案例1:标题('位置:'。$ _SERVER ['DOCUMENT_ROOT']。'/ abc.php')

     

案例2:标题('位置:'。$ _SERVER ['HTTP_HOST']。'/ abc.php')

我怀疑如果你在为网页提供服务的同一台机器上运行你的浏览器,第一个只会起作用。

想象一下,如果其他人使用他们的Windows机器访问您的网站。并且您的网络服务器在HTTP标头中告诉他们,“嘿,实际上,重定向此位置:/var/www/example/abc.php。”您期望用户的机器做什么?

现在,如果你正在谈论像

这样的事情
<?php include($_SERVER['DOCUMENT_ROOT'] . '/include/abc.php') ?>

VS

<?php include($_SERVER['HTTP_HOST'] . '/include/abc.php') ?>

这可能有意义。我怀疑在这种情况下,前者可能是首选,虽然我不是PHP大师。

答案 1 :(得分:3)

呃,问题是什么? DOCUMENT_ROOT包含当前网络的路径,在我的情况下为/home/wwwHTTP_HOST包含testing.local,因为它在本地域上运行。差别很明显,不是吗?

我无法弄清楚你可以在哪里交换这两个,那你为什么要考虑优势呢?

答案 2 :(得分:3)

HTTP_HOST会为您提供主机的网址,例如domain.com

DOCUMENT_ROOT将为您提供在服务器文件系统中记录网站根目录的绝对路径,例如/var/www/domain/

是的,您是否尝试过查看PHP手册,特别是$_SERVER?一切都在那里得到解释。

答案 3 :(得分:2)

<?php include($_SERVER['DOCUMENT_ROOT'] . '/include/abc.php') ?>

应该用于将文件包含在另一个文件中。

header('Location: '. $_SERVER['HTTP_HOST'] . '/abc.php')

应该用于超链接

答案 4 :(得分:1)

如果您想要&#39; example.com&#39; 等域名路径,则可以使用&#34; HTTP_HOST&#34;   如果您想要文件夹&#39; / public_html / foldername /&#39; 路径,您可以使用 &#34; DOCUMENT_ROOT&#34;

答案 5 :(得分:0)

$_SERVER ['HTTP_HOST']返回域网址 a.g. www.example.com 而$_SERVER['DOCUMENT_ROOT']返回当前网络的屋顶。 如

 

答案 6 :(得分:0)

$_SERVER ['HTTP_HOST'] client 定义,甚至可能没有设置!您可以重复请求并保留标头,以在开发人员工具(如Waterfox / Firefox)中进行本地测试。您必须确定是否设置了此标头,以及所请求的主机是否存在(即使在开始发送任何标头之前,您做的第一件事就是做的第一件事),否则适当的操作是杀死整个过程并以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'](处理请求的文件)之间的区别。

答案 7 :(得分:0)

John Ledbetter完美地提出了标题问题。

此遮篷旨在扩展并提供有关原始海报内部关注点的其他信息:

  • 在何处使用基于 URL 的位置: $ _ SERVER ['HTTP_HOST']
  • 在何处使用基于本地的位置: $ _ SERVER ['DOCUMENT_ROOT']
  • 在可以同时使用两者的情况下,每个优点和缺点是什么? ?

跟随我的遮阳篷:

  • 通过使用 HTTP_HOST ,您可以从计算机“文件夹系统”中提取自己,这意味着在考虑到可移植性的情况下,并且希望将应用程序安装在可能具有不同操作系统的多台服务器上,易于维护。
  • 如果您的服务器将不可用,并且您希望集群中的其他服务器来处理请求,那么您还可以利用 HTTP_HOST
  • 通过使用 DOCUMENT_ROOT ,您可以访问整个文件系统(取决于您授予php的权限),如果您想访问一个不想从网络访问的程序,这是很有意义的或文件夹系统与您的应用程序相关。
  • 您还可以利用 DOCUMENT_ROOT 获得子站点的根目录,而不是主机。

    {{1}}

答案 8 :(得分:0)

其他答案都暗示了这一点,但是我想添加一个答案只是要尖锐地像灰熊的牙齿一样-请勿信任$_SERVER['HTTP_HOST'],因为以下代码确实安全:

<?php
header('Location: '. $_SERVER['HTTP_HOST'] . '/abc.php');
#Or 
include($_SERVER['HTTP_HOST'] . '/include/abc.php');
?>

该变量受传入请求的操纵,可能有助于利用。这可能取决于您的服务器配置,但是您不希望为您填写此变量:)

另请参阅: