5

我对什么构成基于 PHP 的 Web 应用程序结构的“最佳实践”感到困惑。阅读这个网站有很多建议。经常提到的一种结构是“文档根目录中没有任何 php 文件”。虽然这听起来不错,但我看不出它是如何工作的——Web 服务器无法识别文档根目录之外的任何内容。我在这里假设文档根目录是公共访问目录,如下所示:

app-
  |
  - htdocs - document root
  | |
  | - index.php
  | - css/
  | - images/
  |
  - PHP classes in here/
  - Other PHP classes in here.../

还是上例中的“app”是文档根目录,而htdocs目录是站点结构的可公开访问区域?

从那以后,我如何确保除htdocs以外的目录中的文件无法进行公共访问?

4

2 回答 2

7

这个概念很简单,特别是如果您使用基于前端控制器的框架,无论它是您自己的还是现有的(如 Zend 框架)。当所有请求都通过中央控制器时,处理请求所需的文件会根据需要包含在内。包含的文件不必位于 Web 根目录中即可工作。它们只需要对控制器可用即可被包含然后执行。因此,只有您的控制器需要位于 Web 根目录中。其他一切都可以在它之外。

仅供参考,这也适用于非 OOP 应用程序。您只需要在每个页面中包含您需要的文件。

Web 根目录中需要的是浏览器请求的任何资产,如图像、样式表、javascript 文件等。

于 2012-05-13T03:05:11.777 回答
5

虽然网络服务器确实不会识别文档根目录“外部”的任何内容,但这仅适用于用户通过 HTTP 请求请求的文件。

PHP 在网络服务器中运行,没有文档根和 URL 的概念。它只看到网络服务器主机操作系统的底层文件系统,以及符合某些标准的数据进出。PHP 唯一会受到一些基于 Web 的限制的情况是,如果 Web 服务器本身在 chroot 监狱中运行。

因此,您可以在文件系统的任何位置放置一个 php 文件并且假设权限正确,PHP 将能够访问并运行它。该文件是否埋在完全位于文档根目录之外的某个 500 层深的目录中并不重要——如果它可以访问,PHP 可以运行它。

于 2012-05-13T04:10:00.923 回答