“Web目录”是通过HTTP直接提供给任何使用正确URL询问的人的目录。因此,如果有人认为您的域上托管了一个文件夹“/foo”,并且您没有采取预防措施,并且实际上存在该文件夹,并且它不包含可用作目录索引的文件,则任何询问的人都可能会获得该文件夹的目录列表,列出所有文件。
现在,这种 Web 托管文件夹与 PHP 中的语句之间的区别在于,PHP 不使用指向可公开访问的 HTTP 托管文件夹的 URL,而是使用指向文件的文件系统路径。require
大多数初学者都把这混为一谈:因为PHP在入门级别就是让一堆脚本分布在Web目录周围,这些脚本会发出很多包含指向其他脚本的链接的HTML,他们的想法是HTML中的链接和PHP中的文件路径是相同的,并且必须是相同的。这是错误的。它们不必相同,它们是相同的,因为没有选择更好的方法。
因此,下面是现代 Web 应用程序的构造方法。如果部署整个项目,则服务器上的主目录可能称为 。此容器内有一些文件,如 .因此,还将有一个 目录 。此外,某个地方将是一个正在访问的PHP脚本(我现在延迟了如何访问它的信息),并且该位置应该是A)或B)。这两个脚本希望使用 Composer 提供的类,并且需要包含自动加载。/var/www/projectX
/var/www/projectX/composer.json
/var/www/projectX/vendor
/var/www/projectX/script.php
/var/www/projectX/public/script.php
由于文件位置的原因,位置 A 中的脚本需要运行 ,而位置 B 中的脚本需要 。只需使用从脚本到自动加载文件的正确相对路径即可。在这两种情况下,您甚至可以使用绝对路径:也将起作用。这里的要点是:如何要求自动加载.php文件并不重要,只要它由脚本执行即可。路径不会影响任何内容。require 'vendor/autoload.php';
require '../vendor/autoload.php';
require '/var/www/projectX/vendor/autoload.php';
现在HTTP托管和访问脚本。Web 服务器至少配置了一个目录,该目录作为域的主目录向外界公开。这叫做 ,它可以是任何地方。现在,这取决于预先选择哪个目录的服务器配置,以及是否可以更改该设置(通过在命令行上管理服务器,或通过单击 GUI 中的某些设置)。DOCUMENT_ROOT
如果您的服务器将目录设置为文档根目录,则所有世界都可以在情况 A 中访问脚本,在情况 B 中可以访问脚本作为 ,并且还可以将供应商文件夹设置为 。这不是很好,但可以通过将文件放在内部或以其他方式限制访问来避免。/var/www/projectX
http://example.com/script.php
http://example.com/public/script.php
http://example.com/vendor/...
.htaccess
更好的解决方案是告诉服务器仅将目录作为文档根目录提供。这将阻止 HTTP 访问脚本 A 和供应商文件夹,并且通过 对脚本 B 的访问完成。/var/www/projectX/public
http://example.com/script.php
在这两种情况下,两个脚本都成功地包含了 Composer 的自动加载,因为 HTTP 访问的限制不适用于文件系统访问。
糟糕的网站托管只允许您使用第一种情况,唯一可访问的目录直接是文档根目录,而没有更改它的方法。
更复杂的网站托管使用固定的子目录(如或)作为文档根目录,允许您隐藏敏感文件,以免通过HTTP提供。public
html
webroot
最好的网站托管允许您选择哪个子目录应托管为文档根目录。
在任何情况下,从脚本指向 Composers 自动加载.php的路径根本不受影响。