2012-05-13 52 views
5

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

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

或者它是“应用程序”,在上面的例子是文档根,以及的htdocs dir是公开网站结构的可访问区域?

接下来,我该如何确保公众访问不适用于除htdocs之外的其他目录中的文件?

回答

7

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

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

什么是需要在Web根目录就像浏览器所请求的图片,styelsheets,JavaScript文件等任何asests。

+0

谢谢你的提示答案!我不在我的OOP应用程序中使用** include **语句。我使用** require_once **。必要时,我的每个类都有require_once语句。这将影响控制器的能力,正如您从访问所需的类所描述的那样? –

+0

不是。他们从根本上做同样的事情。 –

+0

谢谢。我会尝试你的解决方案,并回来的结果。 –

5

虽然确实如此,但网络服务器不会识别文档根目录以外的任何内容,它只适用于通过HTTP请求由USER请求的文件。

PHP运行的网络服务器内,并没有任何文件的根和URL的概念。它只能看到Web服务器主机操作系统的底层文件系统,以及符合某些标准的进出数据。唯一一次PHP受到某些基于Web限制的约束的情况是,如果Web服务器本身在chroot jail中运行。因此,您可以在文件系统上放一个php文件ANYWHERE,并且假设权限是正确的,PHP将能够到达并运行它。如果这个文件被埋在一个完全超出文档根目录500级的目录中 - 如果可以访问,PHP可以运行它。

+0

啊是的 - 这在概念上与上面的答案相似。只要任何基于用户的请求解析为文档根目录,那么一切都会好的。感谢您提供更多信息。我还没有机会回到这一点,但我会让你知道基于你的评论(和上面的评论)的解决方案是如何实现的。 –

+0

谢谢 - 如上所列,解决方案运行良好。 –