-2

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

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

我的目录结构

/
  index.php
    /library
      libSetPathRoot.php

文档根目录

echo $_SERVER["DOCUMENT_ROOT"];
返回:/home/james/web/sites/
“sites”目录包含 /etc/apache2/sites-available 中定义的各种文档根(因此我可以处理不同的脚本)。

文件内容

/index.php
require_once('library/libSetPathRoot.php'); //works fine.. of course

/库/libSetPathRoot.php
define("PATHROOT", realpath(__DIR__ .'/..').'/');

以上正确返回我的根:
echo PATHROOT;// /home/james/web/sites/site3/

我尝试了以下代码和其他各种代码来定义根路径。
这些,以及其他,都不适用于redirect()、include(),什么都没有:
define ('PATHROOT', getenv("DOCUMENT_ROOT"));
define ('PATHROOT', basename(dirname((__DIR__))));
echo PATHROOT;
其他一切似乎只返回“site3”。

工作定义适用于include()并且require()无论它放置在 dir 结构中的什么位置。即,如果在子目录中的文件中调用根目录或其他子目录到根目录,在根目录中的文件中,包含文件等。

但我就是不能让它为header()重定向工作。同样,无论我在哪里使用它——根脚本、子文件夹脚本、包含的脚本。也许我需要另一种方法,但是已经阅读了许多选项并广泛尝试了它们(花了半天时间)。

为什么我的定义适用于包含但不适用于标头重定向,我怎样才能使它适用于所有?还是我必须使用两种方法,一种用于包含,一种用于重定向?

编辑
示例标头重定向我试过:
header('Location: '.PATHROOT.'page-not-found.php');
返回404:/home/james/web/sites/site3/page-not-found.php
(文件确实存在)

4

2 回答 2

2

您可以使用 header() 函数发送新的 HTTP 标头,但这必须在任何 HTML 或文本之前发送到浏览器(例如,在声明之前)。

header('Location: http://www.example.com/');

URL 必须是绝对的。请参阅RFC 2616。但在大多数情况下,相对 URL 也会被接受。

但是头函数和包含函数期望完全不同的参数!头函数期望 URL 和包含函数期望文件系统文件对象。

最终,您可以使用诸如“../../newHeader.php”之类的相对 FS 路径定义来调整标头函数

于 2013-09-12T03:53:50.323 回答
2

您不能使用 header() 进行此类文件重定向。它将 HTTP 标头发送到浏览器,该标头应采用浏览器接受的格式。但是您正在发送一些本地(服务器)文件路径。这显然是行不通的。您必须发送一个用于重定向的 url,例如。header("Location: http://example.com/page-not-found.php")

请参阅 php 文档http://php.net/manual/en/function.header.php

于 2013-09-12T03:56:27.157 回答