如何格式化PHP include()绝对(而不是相对)路径?

Zac*_*son 22 php path include

在我的PHP网站和各种嵌套目录的各个页面上,我想在相对于根的路径中包含特定文件.

我可以在这两个页面上放置什么单一命令......

http://www.example.com/pageone.php
http://www.example.com/somedirectory/pagetwo.php

...包括此页面:

http://www.example.com/includes/analytics.php

这不起作用:

<?php include('/includes/analytics.php'); ?>
Run Code Online (Sandbox Code Playgroud)

这是在Windows上的IIS中托管吗?

J C*_*per 25

你可以使用 include $_SERVER['DOCUMENT_ROOT'] . "/includes/analytics.php";

  • 似乎也不适用于 stream.net 服务器...认为它们是 Linux 吗? (2认同)

Zor*_*che 9

从PHP的角度来看,root是Web服务器上文件系统的顶层,而不是Web浏览器的根目录.

大多数人都会做以下其中一种.

在全局配置文件中定义常量,并在每次调用require/include时使用它.

或者他们使用这样的代码.

require_once realpath(dirname(__FILE__).'/config.php');
require_once realpath(dirname(__FILE__).'/lib/Database.php');
Run Code Online (Sandbox Code Playgroud)

在某些情况下使用环境变量可能是危险的,并且是安全问题的根源.


Gre*_*reg 8

正如@Stefan Mai所说,PHP没有"根"路径,但你可以很容易地定义一个 - 大多数网站都有一个每次都包含的页面(例如配置文件),你可以添加:

define('ROOT', dirname(__FILE__));
Run Code Online (Sandbox Code Playgroud)

然后使用包含ROOT.'/includes/analytics.php';

一些非常有用的东西是auto_prepend指令,你可以在apache上使用.htaccess - 不确定在IIS上设置它(虽然你可以在PHP ini中有一个全局的).


gnu*_*nud 5

如果为include()或require()(或*_once版本)提供绝对路径名,则将包含该文件.绝对路径名在unix上以"/"开头,在Windows上以驱动器号和冒号开头.

如果给出相对路径(任何其他路径),PHP将按顺序搜索配置值"include_path"中的目录,直到找到匹配项或没有其他目录要搜索.

因此,简而言之,要包含绝对文件名,请提供绝对文件名.另请参见函数realpath().

如果你想设置自己的"root",请看看这个问题(特别是我的回答当然:-)


小智 5

我结合了上述建议并提出了这个。

在我的config.php文件中,我将 ROOT 定义为:

define('ROOT', $_SERVER['DOCUMENT_ROOT']);

然后我在后续文件中使用它:

include_once(ROOT."/someFile.php");

include_once(ROOT."/includes/someFile.php");