【问题标题】:Difference between $_SERVER['DOCUMENT_ROOT'] and $_SERVER['HTTP_HOST']$_SERVER['DOCUMENT_ROOT'] 和 $_SERVER['HTTP_HOST'] 之间的区别
【发布时间】:2011-11-05 23:38:21
【问题描述】:

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

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

所以问题是:

$_SERVER['DOCUMENT_ROOT']$_SERVER['HTTP_HOST'] 有什么区别?

两者相比有什么优势吗?

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

【问题讨论】:

  • 我不需要这样做...我知道每一件事的含义,但是如果一个使用 document_root 而其他使用 http_host 在定义路径时,那么路径之间的区别是什么?哪个更常用/可靠/在哪里使用什么?当应用程序使用两者运行时。但仍然应该总和,两者都存在。
  • 您的问题表明您似乎并不了解每个问题的含义。每个人都持有不同的信息。您要求比较苹果和橙子。你会问“街道地址和电话号码有什么区别?”,或者你会在哪里使用它们?
  • 我知道你了。但如果这些东西不同,那么它对Case 1 : header('Location: '. $_SERVER['DOCUMENT_ROOT'] . '/abc.php') Case 2: header('Location: '. $_SERVER['HTTP_HOST'] . '/abc.php') 的工作方式相似......因为你试图说这些是不同的,我知道这些在定义上是不同的,但它们的工作方式相同......
  • 不,不,他们没有。两者都不应该在这种情况下工作,因为它们都不是有效的绝对 URI。文档根是本地路径,在 URI 中没有任何意义。后者缺少 URI 方案和“//”。

标签: php


【解决方案1】:

呃,有什么问题吗? DOCUMENT_ROOT 包含当前网络的路径,在我的例子中是 /home/wwwHTTP_HOST 包含 testing.local,因为它在本地域上运行。区别很明显吧?

我不知道你可以在哪里互换这两者,那你为什么要考虑优势呢?

【讨论】:

  • 我想你们都没有明白我的意思。我知道什么是文档根目录和http_host做什么...但是我在所有项目中都使用过HTTP_HOST,但是我的前辈说你应该使用Document_root,它更可靠。我问他,他让我找找。现在我只问在定义路径时我应该选择文档根目录,而不是 HTTP_HOST。
【解决方案2】:

HTTP_HOST 将为您提供主机的 URL,例如domain.com

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

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

【讨论】:

  • HTTP_HOST 不是 URL,它只是一个(等待它)主机名。没有“http:”方案。
  • 我想你们都没有明白我的意思。我知道什么是文档根目录和http_host做什么...但是我在所有项目中都使用过HTTP_HOST,但是我的前辈说你应该使用Document_root,它更可靠。我问他,他让我找找。现在我只问在定义路径时我应该选择文档根目录,而不是 HTTP_HOST。
  • 这意味着您或您的上级不了解它们之间的区别。您能否提供一些您使用HTTP_HOST 的代码示例?
  • 案例一:header('Location: '. $_SERVER['DOCUMENT_ROOT'] . '/abc.php') 案例二:header('Location: '. $_SERVER['HTTP_HOST'] . '/abc.php')
  • 案例 1 不正确。情况 2 正常。如果在您的设置案例 1 中按预期工作 - 这很奇怪。
【解决方案3】:

DOCUMENT_ROOT

该站点的根目录由 General 部分或部分中的“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('Location: '.$_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 Guru。

【讨论】:

  • 我想你们都没有明白我的意思。我知道什么是文档根目录和http_host做什么...但是我在所有项目中都使用过HTTP_HOST,但是我的前辈说你应该使用Document_root,它更可靠。我问他,他让我找找。现在我只问在定义路径时我应该选择文档根目录,而不是 HTTP_HOST。
【解决方案4】:
<?php include($_SERVER['DOCUMENT_ROOT'] . '/include/abc.php') ?>

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

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

应该用于超链接

【讨论】:

  • 正好相反。
【解决方案5】:

如果你想要像 'example.com' 这样的域路径,你可以使用 "HTTP_HOST" 如果你想要文件夹 '/public_html/foldername/' 路径,你可以使用 “DOCUMENT_ROOT”

【讨论】:

  • 如果你想要文件夹和文件路径,使用 document_root 像 public_html/folderpath/files 如果你想要 url web 路径然后使用 http_host 像 www.website.com
【解决方案6】:

$_SERVER ['HTTP_HOST'] 返回域 url 一个。 www.example.com 而$_SERVER['DOCUMENT_ROOT'] 返回当前网络的屋顶.. 比如

【讨论】:

    【解决方案7】:

    $_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'](处理请求的文件)之间存在差异。

    【讨论】:

      【解决方案8】:

      John Ledbetter 完美地回答了标题问题。

      此遮阳篷旨在扩展并提供有关原始海报内部问题的更多信息:

      • 在哪里使用基于 URL 的位置:$_SERVER['HTTP_HOST']
      • 在哪里使用基于本地的位置:$_SERVER['DOCUMENT_ROOT']
      • 两者都可以使用的地方,各自的优点和缺点是什么。 ?

      跟随我的遮阳篷:

      • 通过使用 HTTP_HOST,您可以将自己从机器文件夹系统中抽象出来,这意味着在考虑可移植性并且您需要在可能具有不同操作系统的多台服务器上安装应用程序的情况下,这种方法可以更容易维护。
      • 如果您的服务器将变得不可用并且您希望集群中的另一个服务器来处理请求,您也可以利用 HTTP_HOST
      • 通过使用 DOCUMENT_ROOT,您可以访问整个文件系统(取决于您授予 php 的权限),如果您想访问您不想从 Web 访问的程序,这是有意义的或者当文件夹系统与您的应用程序相关时。
      • 您还可以利用 DOCUMENT_ROOT 来获取子站点根目录而不是主机。

        $_SERVER['HTTP_HOST'] = "www.example.com";
        $_SERVER['DOCUMENT_ROOT'] = "var/www/domain/subsite1" // equivalent to www.example.com/subsite1
        

      【讨论】:

        【解决方案9】:

        其他答案已经暗示了这一点,但我想添加一个答案,只是为了在某一点上像灰熊的牙齿一样锋利 - 不要相信$_SERVER['HTTP_HOST'] 在以下代码中是安全的:

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

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

        另见:

        【讨论】:

          猜你喜欢
          • 2011-09-22
          • 2013-08-12
          • 2011-12-13
          • 1970-01-01
          • 2016-01-31
          • 1970-01-01
          • 1970-01-01
          • 2023-04-04
          • 1970-01-01
          相关资源
          最近更新 更多