如何在PHP中设置绝对包含路径?

时间:2008-12-05 16:34:24

标签: php

在HTML中,我可以通过以“/”开头的文件路径,从 Web服务器的根文件夹开始找到一个文件。像:

/images/some_image.jpg

我可以将该路径放在任何子目录中的任何文件中,它将指向正确的图像。

使用PHP,我尝试了类似的东西:

include("/includes/header.php");

......但这不起作用。

我认为this page表示我可以设置include_path一次,之后会假设。但我不太懂语法。这两个例子都以句号开头,并说:

使用。在include路径中允许相对包含,因为它表示当前目录。

相对包含正是我想要的。

如何确保我的所有包含都指向root/includes文件夹?(奖励:如果我想将该文件夹放在公共目录之外该怎么办?)

澄清

我的开发文件目前由XAMPP / Apache提供。这会影响绝对路径吗? (我不确定生产服务器是什么。)

更新

我不知道我的问题在这里。我上面引用的include_path内容正是我所寻找的,而且语法并不是真的令人困惑。我只是尝试了它,效果很好。

我发生的一件事是,有些人可能认为“/ some / path”是“绝对路径”,因为他们认为操作系统是Linux。此服务器是Windows,因此绝对路径必须以驱动器名称开头。

无论如何,问题解决了! :)

10 个答案:

答案 0 :(得分:45)

我所做的是将config.php文件放在我的根目录中。我的项目中的所有PHP文件都包含此文件。在那个config.php文件中,我然后执行以下操作;

define( 'ROOT_DIR', dirname(__FILE__) );

然后在所有文件中,我知道我的项目的根源是什么,可以做这样的事情

require_once( ROOT_DIR.'/include/functions.php' );

对不起,没有获得公共目录以外的奖励积分;)这也有一个不幸的副作用,你仍然需要一个相对路径来查找config.php,但它使你的其他包括更容易。

答案 1 :(得分:24)

一种策略

我不知道这是不是最好的方式,但它对我有用。

$root = $_SERVER['DOCUMENT_ROOT'];
include($root."/path/to/file.php");

答案 2 :(得分:8)

include_path设置与unix中的$ PATH类似(Windows中也有类似的设置)。它包含多个目录名,由冒号(:)分隔。当您包含或要求文件时,将按顺序搜索这些目录,直到找到匹配项或搜索所有目录。

因此,要确保您的应用程序始终包含您的路径(如果该文件存在),只需将include目录放在目录列表中。

ini_set("include_path", "/your_include_path:".ini_get("include_path"));

这样,首先搜索include目录,然后搜索原始搜索路径(默认为当前目录,然后是PEAR)。如果您在修改include_path时没有问题,那么这就是您的解决方案。

答案 3 :(得分:3)

include / require中没有任何内容禁止您使用绝对路径。 所以你的例子

include('/includes/header.php'); 

应该工作得很好。假设路径和文件是corect并且设置了正确的权限 (从而允许您在文档根目录内外包含您喜欢的任何文件)

然而,这种行为被认为是一种可能的安全风险。因此,系统管理员可以设置open_basedir指令。

此指令配置您可以包含/要求文件的位置,这可能只是您的问题 某些控制面板(例如plesk)默认情况下将此指令设置为与文档根相同。

至于'.'语法:

/home/username/public_html <- absolute path  
public_html <- relative path  
./public_html <- same as the path above  
../username/public_html <- another relative path  

但是,我通常使用稍微不同的选项:

require_once(__DIR__ . '/Factories/ViewFactory.php');

在此版本中,您指定相对于包含require_once()语句的文件的绝对路径。

答案 4 :(得分:2)

另一种选择是使用绝对路径的定义在$_SERVER['DOCUMENT_ROOT']目录中创建一个文件。

例如,如果您的$_SERVER['DOCUMENT_ROOT']目录是

C:\wamp\www\

创建一个包含此

的文件(即my_paths.php
<?php if(!defined('MY_ABS_PATH')) define('MY_ABS_PATH',$_SERVER['DOCUMENT_ROOT'].'MyProyect/')

现在您只需要在MyProyect文件夹中的每个文件中包含此文件(my_paths.php),这样您就可以将MY_ABS_PATH用作MyProject的绝对路径。

答案 5 :(得分:0)

不是直接回答你的问题,而是要记住的事情:

  

在你的ini中使用include with allow_url_include时要注意,当从包含的文件访问会话时,如果从脚本中使用绝对文件引用包含一个文件,然后使用url文件在本地服务器上包含第二个文件引用它们具有不同的变量范围,并且不会从两个包含的文件中看到相同的会话。原始会话将不会从包含URL的文件中看到。

来自:http://us2.php.net/manual/en/function.include.php#84052

答案 6 :(得分:0)

嘿所有......我和我的cms系统有类似的问题。 我需要一些安全方面的艰难道路。 认为最好的方式就像抢写道。快速编码 认为这也有效..: - )

<?php
$path   = getcwd(); 
$myfile = "/test.inc.php";

/* 

getcwd()指向:     / usr / srv / apache / htdocs / myworkingdir(例如)

echo ($path.$myfile);
would return...

/usr/srv/apache/htdocs/myworkingdir/test.inc.php

access outside your working directory is not allowed.
*/


includ_once ($path.$myfile);

//some code

?>
好日子 strtok的

答案 7 :(得分:0)

我在这个上遵循Wordpress的例子。我去定义一个根路径,通常是文档根目录,然后定义一堆其他路径(每个我的类目录一个.IE:数据库,用户,HTML等)。通常我会手动定义根路径,而不是依赖服务器变量。

示例


if($_SERVER['SERVERNAME'] == "localhost")
{
    define("ABS_PATH", "/path/to/upper/most/directory"); // Manual
}
else
{
    define("ABS_PATH, dirname(__FILE__));
    // This defines the path as the directory of the containing file, normally a config.php
}

// define other paths...

include(ABS_PATH."/mystuff.php");

答案 8 :(得分:0)

谢谢 - 如果您使用google for php apache windows绝对路径,这是2个链接中的一个。

作为中间PHP开发人员的新手我不明白为什么apache windopws系统上的绝对路径将是c:\ xampp \ htdocs(apache document root - XAMPP default)而不是/

因此,如果在http // localhost / myapp / subfolder1 / subfolder2 / myfile.php中,我想要包含来自http // localhost / myapp

的文件

我需要将其指定为: 包括( “C:\ XAMPP \ htdocs中\ MYAPP \ includeme.php”) 要么 包括( “../../ includeme.php”)

而不是 包括( “/ MyApp的/ includeme.php”)

答案 9 :(得分:0)

我想出了一行代码来设置我的每个PHP脚本的顶部以补偿:

<?php if(!$root) for($i=count(explode("/",$_SERVER["PHP_SELF"]));$i>2;$i--) $root .= "../"; ?>

通过这个建筑物$ root to bee“../”从文件所在的任何位置升级到层次结构。 每当我想要包含absolut路径时,该行将是:

<?php include($root."some/include/directory/file.php"); ?>

我真的不喜欢它,似乎是一种解决它的尴尬方式,但它似乎可以运行任何系统php运行和文件放置的位置,使其独立于系统。 要访问网络目录之外的文件,请在../之后再添加一些$root,例如$root."../external/file.txt"