0

可能重复:
将 include_once 与 php 变量一起使用时出错

我的代码是这样的:

<?php   // file location: include/config.php
    $CONFIG["DIRECTORY"]["HTMLINC"] = "http://127.0.0.1/mysite/html_include";
?>

,

<?php   // file location: ./template.php
    require_once("include/config.php");
    // ...
    require($CONFIG["DIRECTORY"]["HTMLINC"] . "/anotherpage.php"); // Doesn't work
?>

它给出以下警告消息:

警告:require(): http:// wrapper 在服务器配置中被allow_url_include=0 禁用...

我目前正在本地服务器中测试代码,因此我可以轻松更改allow_url_include. 但我最终会将这段代码上传到远程服务器。我不能保证allow_url_include将始终设置为1.

如何防止此警告消息并使此代码正常工作?

4

3 回答 3

3

这不是绝对路径。那是一个网址。绝对路径将是磁盘上文件的路径。如果你去/var/www/mysite/html_include访问文件进行编辑,那就是绝对路径。您可能希望设置$CONFIG["DIRECTORY"]["HTMLINC"]为该绝对路径。您可以使用$_SERVER['DOCUMENT_ROOT']获取 apache 提供的 Web 根目录并附/mysite/html_include加以生成正确的路径。理想情况下,您可能会有一个名为 APP_ROOT 的单独配置变量,它是文档根 + /mysite(应用程序的绝对路径)。就像是:

<?php
$CONFIG["DIRECTORY"]["APP_ROOT"] = $_SERVER['DOCUMENT_ROOT'].'/mysite';
$CONFIG["DIRECTORY"]["HTMLINC"] = $CONFIG["DIRECTORY"]["APP_ROOT"].'/html_include';

这也将允许您将 APP_ROOT 用于其他变量:

$CONFIG["DIRECTORY"]["UPLOADS"] = $CONFIG["DIRECTORY"]["APP_ROOT"].'/uploads';
$CONFIG["DIRECTORY"]["IMAGES"] = $CONFIG["DIRECTORY"]["APP_ROOT"].'/images';
$CONFIG["DIRECTORY"]["THUMBNAILS"] = $CONFIG["DIRECTORY"]["APP_ROOT"].'/thumbs';

等等

于 2012-10-19T21:17:22.483 回答
2

不要使用 http URL 作为您的包含 - 它们无论如何都不会按您期望的方式工作。

如果它们被启用,它们将被视为外部 URL,因此在提供给包含页面之前由 PHP 解析。因此,结果输出将不包含任何 PHP 代码,因为它已经被执行。

如果要包含本地文件,则需要提供本地磁盘上的目录路径,而不是 URL(甚至不是 localhost URL)。

在任何情况下,任何理智的托管公司几乎总是禁用从 URL 运行包含的功能,因为允许代码从第三方站点进入并直接在您的系统上运行会带来巨大的安全风险。

如果您想包含网站本地的文件,您可以使用$_SERVER['DOCUMENT_ROOT']来引用站点的根目录,或者__DIR__引用当前文件的目录。我想前者在你的情况下是最好的,所以你需要这个:

$CONFIG["DIRECTORY"]["HTMLINC"] = $_SERVER['DOCUMENT_ROOT']."/mysite/html_include";

希望有帮助。

于 2012-10-19T21:22:22.103 回答
1

您使用“http://127.0.0.1”输入一个 URL。您必须从文件系统引用它,而不是通过本地 IP。所以你需要设置$CONFIG["DIRECTORY"]["HTMLINC"] = '/path/from/root/html_include'

文件系统中的“绝对路径”与 HTML 中的绝对路径不同(以协议开头 - 即“http://”)。

于 2012-10-19T21:17:21.283 回答