php 包括使用 URL,但不包括根路径。服务器配置或编码语法?

php include working with URL, but not root path. Server configuration or coding syntax?

我最近从专用服务器环境迁移到云服务器,我在 php 包含的根目录相对路径方面遇到了问题。当我包含整个 URL 时,php 包含效果很好。但是当我在子目录中使用根相对路径时它不起作用。想法?

与URL

合作
<?php include 'http://website.com/assets/includes/nav.php';?>

文件位置http://website.com/folder/page

有效,但仅在根 index.php 文件中。在子目录

中不起作用
<?php include 'assets/includes/nav.php';?>

文件位置http://website.com/index

不使用根相对路径

<?php include '/assets/includes/nav.php';?> 

文件位置http://website.com/folder/page

如果文件在同一台服务器上(这可能是 99.99% 的情况)你不应该使用 URL 到 include 它。这是非常低效的,因为它需要服务器发出额外的 HTTP 请求。当然,远程 Web 服务器输出的是包含的内容 - 不是 PHP 源代码,而是解析后的输出。同样,任何有权访问远程 URL 的人都可以将代码注入您的网站。相反,您应该使用文件系统直接访问文件。

如果您包含一个以 / 开头的文件,那么这是相对于根文件系统的,而不是网站根目录。这就是为什么您的第三个示例不起作用的原因。例如,您的 Web 服务器可以提供来自 /var/www/html 的页面,因此要包含该目录中的文件,您需要使用 /var/www/html/ 启动它或使包含路径相对。

我通常做的是从位于应用程序根目录中的文件中调用每个请求(例如配置文件):

set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__);

然后在任何其他文件中,我可以只包含相对于该应用程序根目录的文件:

include 'path/to/subdirectory/file.php';

您只需要注意重复的文件名。例如,如果您有:

/var/www/html
├── class
│   ├── controller
│   │   ├── include.php
│   │   ├── FruitController.php
├── include.php

然后从 FruitController.php 文件中 include include.php,它将检查 get_include_path() 的第一个路径,如果没有找到,则检查下一个路径,直到它要么找到包含的文件,要么找到带有警告或错误的 returns。因此,根据您在 set_include_path() 中输入的顺序,它将包括 /var/www/html/include.php/var/www/html/class/controller/include.php

执行此操作并向您所包含的内容添加显式控制的另一种方法是将以下内容放入应用程序根目录的文件中:

define('APP_ROOT', __DIR__);

然后在任何其他文件中执行:

include APP_ROOT . '/path/to/subdirectory/file.php';