![](/img/trans.png)
[英]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.