我正在尝试创建一个常量来定义我的网络根目录,我可以使用它来构建需求、标头重定向、图像等的路径。
在根文件夹和子文件夹中的文件中使用时,我需要常量才能工作。我知道我可以轻松地用../
等对路径进行硬编码,但我试图让它工作的主要原因(除了干净的代码)是这样我就可以在不同服务器上的各种站点上重用代码,路径可能会有所不同。
我的目录结构
/
index.php
/library
libSetPathRoot.php
文档根目录
echo $_SERVER["DOCUMENT_ROOT"];
返回:/主页/詹姆斯/网站/网站/
"sites" dir 包含在/etc/apache2/sites-available 中定义的各种文档根目录(所以我可以在不同的脚本上工作)。
文件内容
/索引.php
require_once('library/libSetPathRoot.php'); //works fine.. of course
library/libSetPathRoot.php
define("PATHROOT", realpath(__DIR__ .'/..').'/');
上面正确返回我的根目录:
echo PATHROOT;// /home/james/web/sites/site3/
我尝试了以下代码和各种其他代码来定义根路径。
这些和其他的都不适用于重定向(),include(),什么都没有:define ('PATHROOT', getenv("DOCUMENT_ROOT"));
define ('PATHROOT', basename(dirname((__DIR__))));
echo PATHROOT;
其他一切似乎只返回"site3"。
工作定义适用于include()
和require()
,无论它放置在目录结构中的哪个位置。 即,如果在子目录到根的文件中调用根或其他子目录到根,在根目录中,包含的文件等。
但我只是无法让它为header()
重定向工作。同样,无论我在哪里使用它 - 根脚本、子文件夹脚本、包含的脚本。也许我需要另一种方法,但已经阅读了许多选项并进行了广泛的尝试(花了半天时间)。
为什么我的定义适用于包含而不是标头重定向,我怎样才能让它适用于所有?还是我必须使用两种方法,一种用于包含,一种用于重定向?
编辑
我尝试过的示例标头重定向:header('Location: '.PATHROOT.'page-not-found.php');
返回 404:/home/james/web/sites/site3/page-not-found.php
(该文件确实存在)
你不能用 header() 做这样的文件重定向。它将HTTP标头发送到浏览器,该标头应采用浏览器可接受的格式。但是您正在发送一些本地(服务器)文件路径。这显然是行不通的。您必须发送一个 URL 以进行重定向,例如。 header("Location: http://example.com/page-not-found.php")
请参阅 php 文档 http://php.net/manual/en/function.header.php
您可以使用 header() 函数发送新的 HTTP 标头,但这必须在任何 HTML 或文本之前发送到浏览器(例如,在声明之前)。
header('Location: http://www.example.com/');
URL 必须是绝对的。请参阅 RFC 2616。但在大多数情况下,也会接受相对 URL。
然而,标头函数和包含函数期望完全不同的参数!标头函数需要 URL,包含函数需要文件系统文件对象。
最终,您可以使用相对 FS 路径定义(如"../../newHeader.php"