不能用绝对路径调用`require()`(`allow_url_include`在PHP.ini中设置为'0`)

时间:2012-10-19 21:14:28

标签: include relative-path php absolute-path

  

可能重复:
  error using include_once with a php variable

我的代码是这样的:

<?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://在服务器配置中通过allow_url_include = 0禁用包装器...

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

如何阻止此警告消息并使此代码生效?

3 个答案:

答案 0 :(得分:3)

这不是一条绝对的道路。这是一个URL。绝对路径将是磁盘上文件的路径。如果您转到/var/www/mysite/html_include访问该文件进行编辑,那就是绝对路径。您可能希望将$CONFIG["DIRECTORY"]["HTMLINC"]设置为该绝对路径。您可以使用$_SERVER['DOCUMENT_ROOT']获取apache提供的Web根目录,并附加/mysite/html_include以生成正确的路径。理想情况下,您可能会有一个单独的配置变量,称为APP_ROOT,它是文档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';

答案 1 :(得分:2)

不要使用http网址作为你的包含 - 它们无论如何都不会以你期望的方式运作。

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

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

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

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

$CONFIG["DIRECTORY"]["HTMLINC"] = $_SERVER['DOCUMENT_ROOT']."/mysite/html_include";
希望有所帮助。

答案 2 :(得分:1)

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

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