作曲家:我应该把“供应商”放在哪里?文件夹中


Composer: where should I put the "vendor" folder?

我有一些类似于这里所解决的问题。我正在使用Composer安装Amazon AWS组件来设置SES(电子邮件)服务。

根据Amazon文档,为了使用我安装的类,我需要包含autoload.php。这意味着autoload.php必须在我的web目录(/var/www/html)。

我没有完全理解我之前提到的SO问题的答案,但它本质上说供应商目录不应该在web目录中。但是,如果我这样做,我将如何requireautoload.php文件,这是在/vendor目录?

总的来说,我很困惑我应该如何正确地设置这个。如有任何帮助,不胜感激。

编辑:这篇文章还建议把/vendor/文件夹放在web目录下。这是标准吗?我应该注意哪些安全风险?因为在任何文件夹中都没有index.html文件或任何东西,所以可以自由地查看和访问已安装的所有文件的目录。这肯定不是件好事吧?

"web目录"是通过HTTP直接提供给任何询问正确URL的目录。因此,如果有人认为在您的域名上托管了一个文件夹"/foo",而您没有采取预防措施,并且实际上存在该文件夹,并且它不包含将作为目录索引的文件,任何人询问可能会得到该文件夹的目录列表,列出所有文件。

现在,这种web托管文件夹和PHP中的require语句的区别在于PHP不使用URL指向可公开访问的HTTP托管文件夹,而是使用文件系统路径指向文件。

大多数初学者都混淆了这一点:因为PHP初学者都是在web目录中散布一堆脚本,这些脚本发出许多HTML,其中包含到其他脚本的链接,他们认为HTML中的链接和PHP中的文件路径是相同的,并且必须是相同的。这是错误的。它们不一定是相同的,它们是相同的,因为没有选择更好的方法。

所以这就是现代web应用程序是如何构建的。如果部署整个项目,则服务器上的主目录可能称为/var/www/projectX。在这个容器中有一些文件,如/var/www/projectX/composer.json。因此还会有一个目录/var/www/projectX/vendor。此外,某个地方将是一个PHP脚本正在被访问(我延迟信息如何访问它现在),该位置应该是A) /var/www/projectX/script.php或B) /var/www/projectX/public/script.php。这两个脚本想要使用Composer提供的类,并且需要包含自动加载。

由于文件位置的原因,A位置的脚本需要运行require 'vendor/autoload.php';, B位置的脚本需要运行require '../vendor/autoload.php';。这只是使用从脚本到自动加载文件的正确相对路径的问题。在这两种情况下,您甚至可以使用绝对路径:require '/var/www/projectX/vendor/autoload.php';也可以。这里的要点是:只要脚本执行了autolload .php文件,您如何要求它并不重要。该路径不影响任何内容

现在HTTP托管和访问脚本。web服务器至少配置了一个目录,该目录作为域的主目录向外界公开。这被称为DOCUMENT_ROOT,它可以在任何地方。现在,这取决于您的服务器的配置,哪个目录是预先选择的,以及您是否可以更改该设置(通过在命令行上管理您的服务器,或者通过单击GUI中的某些设置)。

如果您的服务器将目录/var/www/projectX设置为文档根目录,则所有人都可以访问情况A中的脚本为http://example.com/script.php,情况B中的脚本为http://example.com/public/script.php,供应商文件夹为http://example.com/vendor/...。这不是很好,但可以通过将.htaccess文件放在其中或以其他方式限制访问来避免。

更好的解决方案是告诉服务器只将目录/var/www/projectX/public作为文档根目录。这将阻止HTTP访问脚本A和供应商文件夹,并通过http://example.com/script.php访问脚本B。

在这两种情况下,两个脚本都成功地包含了Composer的自动加载,因为HTTP访问的限制并不适用于文件系统访问。

糟糕的网站托管只允许你使用第一种情况,你唯一可以访问的目录是直接文档根目录,没有办法改变它。

更复杂的网站托管ís使用固定的子目录,如publichtmlwebroot作为文档根目录,允许您隐藏敏感文件从不通过HTTP提供。

最好的网站托管允许您选择哪个子目录应该作为文档根托管。

在任何情况下,从脚本指向composer autolload .php的路径都不受影响。