繁体   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