作曲家:我应该把"vendor"文件夹放在哪里?

Cha*_*les 16 php amazon-web-services amazon-ses composer-php

我有类似于此处所述的问题.我正在使用Composer安装Amazon AWS组件来设置SES(电子邮件)服务.

根据亚马逊文档,我需要包含autoload.php才能使用我安装的类.这意味着autoload.php必须在我的web目录(/ var/www/html)中.

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

总的来说,我对如何正确设置这一点非常困惑.任何帮助,将不胜感激.

编辑: 文章还建议把/供应商/文件夹中的网站目录.这是标准吗?我应该注意哪些安全风险?由于任何文件夹中都没有index.html文件或任何内容,因此可以自由查看和访问所有已安装文件的目录.当然这不是一件好事吗?

Sve*_*ven 33

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

现在,这样的Web托管文件夹和requirePHP中的语句之间的区别在于PHP不使用指向可公开访问的HTTP托管文件夹的URL,而是使用指向文件的文件系统路径.

大多数初学者都混淆了这一点:因为初学者级别的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';也可以使用.这里的要点是:只要它被脚本执行,你需要autoload.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作为文档根目录提供.这将阻止对脚本A和供应商文件夹的HTTP访问,并且通过执行脚本B的访问http://example.com/script.php.

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

糟糕的网站托管只允许您使用第一个方案,只有您可以直接访问文档根目录,而无需更改方法.

更复杂的网站托管使用固定子目录public,html或者webroot作为文档根目录,允许您隐藏敏感文件,使其不再通过HTTP提供服务.

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

无论如何,从脚本指向Composers autoload.php的路径根本不受影响.

  • 感谢您的解释,我想我现在更好了。我的网站目录根目录位于`/ var / www / html /`中,因此在这种情况下,建议将`vendor`文件夹放在`/ var / www / vendor`之类的位置,然后通过相对路径访问它,这是正确的? (2认同)
  • 确切地。但请注意,您无法通过 FTP 有选择地上传该文件夹来随意将该文件夹放置在您喜欢的任何位置。创建该文件夹是因为您的 Composer 配置将其放在某处,并且您自己的类也应该包含在该自动加载中。因此,您应该做的就是在开发计算机上按照预期创建目录结构,运行 Composer(以及其他任何东西),然后将整个结构一次性上传到服务器。 (2认同)