定义 Web 根目录 - consant 适用于包含但不适用于重定向


Define web root dir - consant works on include but not redirect

我正在尝试创建一个常量来定义我的网络根目录,我可以使用它来构建需求、标头重定向、图像等的路径。

在根文件夹和子文件夹中的文件中使用时,我需要常量才能工作。我知道我可以轻松地用../等对路径进行硬编码,但我试图让它工作的主要原因(除了干净的代码)是这样我就可以在不同服务器上的各种站点上重用代码,路径可能会有所不同。

我的目录结构

/
  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"