/ 在指向根文件夹的链接的开头在 php 包含中不起作用。
例如“/example/example.php”
解决办法是什么?
我假设根文件夹是指您的 Web 文档根目录,而不是文件系统根目录。
为此,您可以
include('example/example.php')
include($_SERVER['DOCUMENT_ROOT'].'/example/example.php')
我也有这个问题。Paul Dixon 的回答是正确的,但也许这会帮助您理解原因:
这里的问题是 PHP 是一种服务器端语言。纯 HTML 文档可以根据您在服务器上设置的根 url 访问文件(即,从您所在的任何子目录访问图像,您将使用/images/example.jpg
从顶级目录向下访问),PHP 实际上访问使用时的服务器根目录include (/images/example.jpg)
您设置的站点结构实际上位于 Apache 服务器的文件系统中。我的站点根目录看起来像这样,从服务器根目录开始向下:
/home2/siteuserftp/public_html/test/
“test”代表您的站点根目录
所以要回答你的问题,为什么你的 PHP 包含没有得到你想要的结果(它完全按照它应该的方式工作)是因为你要求 PHP 代码尝试在服务器根目录中找到你的文件,而实际上它是位于您网站的 HTML 根目录中,类似于上面的内容。
您的文件将基于“test/”的站点根目录,看起来像这样:
/home2/siteuserftp/public_html/test/about/index.php
Paul Dixon 提供的答案:
include($_SERVER['DOCUMENT_ROOT'].'/example/example.php')
正是解决您的问题的方法(不用担心试图找到文档根目录来替换“DOCUMENT_ROOT”,PHP 会为您做这件事。只要确保您的字面上有“DOCUMENT_ROOT”)
编辑:
更多信息 DOCUMENT_ROOT 和其他 PHP SERVER 变量可以在这里找到
include()(以及许多其他函数,如 require()、fopen() 等)都在本地文件系统上工作,而不是在 web 根目录下工作。
所以,当你做这样的事情
include( "/example/example.php" );
您正在尝试从 *nix 机器的根目录中包含。
虽然有多种方法可以处理您正在做的事情,但 Paul Dixon 的建议可能是您最好的选择。
每个 Web 服务器都有一个public_html
文件夹,您通常在其中保存文件等。通过使用/
,您将无法访问public_html
,而是直接指向主(无法访问的)根目录。所以,$_SERVER['DOCUMENT_ROOT']."/your/locati.on"
改用
我在运行 Windows 和 IIS 的机器上解决了这个问题:
<?php
$docroot = 'http://www.example.com/';
include ($docroot.'inc-header.php');
?>
如果您在本地开发机器上,您可以通过在 C:\Windows\System32\drivers\etc\hosts 中添加以下内容来强制您的域指向 localhost
127.0.0.1 www.example.com
此外,您需要像这样在 php.ini 中启用 allow_url_include
allow_url_include = On
对我来说,以下技巧奏效了。我正在使用带有 IIS 的 Windows,所以 DOCROOT 是 C:\Inetpub\wwwroot。
subst W: C:\Inetpub\wwwroot
include_path = ".;c:\php\active\includes;W:\" doc_root = W:\
现在,两个版本都允许:
包括'/common/common.inc';// 访问映射的 W: root 包括“common/common.inc”;// 访问 W: 在 include_path 中
这个答案并不是真正针对根目录,但一种解决方法是使用../
跳转到父目录。
当然,您需要知道这种方法的文件结构。
例如,您可以使用:
include('../parent.php');
include('../../grand_parent.php');
也许这有点不合常规
如果我有这样的情况
/var/www/namedir/ <= root
/var/www/namedir/example/example.php <= file to include
-- directory when i need the include --
/var/www/namedir/dir1/page.php
/var/www/namedir/dir1/dirA/page.php
/var/www/namedir/dir1/dirB/page.php
我使用的解决方案很简单。获取“Dir1”之前的路径
像这样的东西
include (substr(dirname(__FILE__),0,strpos(dirname(__FILE__), '/dir1'))."/example/example.php");
我发现它很有用,我需要重命名主子目录,例如从
/var/www/namesite/internalDirA/dirToInclude/example.php
/var/www/namesite/internalDirA/dir1/dirA/example.php
/var/www/namesite/internalDirA/dir1/dirB/example.php
至
/var/www/namesite/dirReserved/dirToInclude/example.php
/var/www/namesite/dirReserved/dir1/dirA/example.php
/var/www/namesite/dirReserved/dir1/dirB/example.php
某些版本的 PHP 可能在文档根目录的末尾有分隔符,而其他版本可能没有。作为一个实际问题,您可能想要使用:
$r = trim(filter_input(INPUT_SERVER, 'DOCUMENT_ROOT', FILTER_SANITIZE_STRING));
if (substr($r, 0, 1) == '/')
{
define("PATCH_SEPARATOR", "/");
}
else
{
define("PATCH_SEPARATOR", "\\");
}
if (substr($r, -1) == PATCH_SEPARATOR)
{
include_once ($r . 'example/example.php');
}
else
{
include_once ($r . PATCH_SEPARATOR . 'example/example.php');
}