Php 作曲者:我应该把“音乐”放在哪里;“供应商”;文件夹?
我的关切与所讨论的类似。我正在使用Composer安装AmazonAWS组件以设置SES(电子邮件)服务 根据Amazon的说法,为了使用我安装的类,我需要包含Php 作曲者:我应该把“音乐”放在哪里;“供应商”;文件夹?,php,amazon-web-services,composer-php,amazon-ses,Php,Amazon Web Services,Composer Php,Amazon Ses,我的关切与所讨论的类似。我正在使用Composer安装AmazonAWS组件以设置SES(电子邮件)服务 根据Amazon的说法,为了使用我安装的类,我需要包含autoload.php。这意味着autoload.php必须位于我的web目录(/var/www/html)中 我没有完全理解我前面提到的SO问题的答案,但它本质上说供应商目录不应该在web目录中。但是如果我这样做,我将如何需要autoload.php文件,该文件位于/vendor目录中 总的来说,我很困惑我应该如何正确地设置它。任何帮
autoload.php
。这意味着autoload.php
必须位于我的web目录(/var/www/html)中
我没有完全理解我前面提到的SO问题的答案,但它本质上说供应商目录不应该在web目录中。但是如果我这样做,我将如何需要autoload.php
文件,该文件位于/vendor目录中
总的来说,我很困惑我应该如何正确地设置它。任何帮助都将不胜感激
编辑:文章还建议将/vendor/文件夹放在web目录中。这是标准吗?我应该注意哪些安全风险?由于任何文件夹中都没有index.html文件或任何内容,因此可以自由查看和访问已安装的所有文件的目录。这肯定不是一件好事吗?web目录是通过HTTP直接提供给任何询问正确URL的人的目录。因此,如果有人认为您的域中有一个文件夹“/foo”,而您没有采取预防措施,并且实际上存在该文件夹,并且该文件夹不包含用作目录索引的文件,任何询问的人都可能会得到该文件夹的目录列表,列出所有文件
现在,这种web托管文件夹与PHP中的require
语句之间的区别在于,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中的脚本需要要求“../vendor/autoload.php”代码>。这只是使用从脚本到自动加载文件的正确相对路径的问题。您甚至可以在这两种情况下使用绝对路径:require'/var/www/projectX/vendor/autoload.php'代码>也将起作用。这里的要点是:不管您如何要求autoload.php文件,只要它由脚本执行就行。路径不会影响任何内容
现在HTTP托管和访问脚本。Web服务器至少配置了一个目录,该目录作为域的主目录公开给外部世界。这称为DOCUMENT\u ROOT
,它可以在任何地方。现在,它取决于服务器的配置,预先选择哪个目录,以及您是否可以更改该设置(通过在命令行上管理服务器,或通过单击GUI中的某些设置)
如果您的服务器将目录/var/www/projectX
设置为文档根目录,则所有人都可以以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
在这两种情况下,两个脚本都成功地包含了Composer的自动加载,因为HTTP访问的限制不适用于文件系统访问
糟糕的网站托管只允许您使用第一种方案,您唯一可以访问的目录是直接作为文档根目录的目录,而没有更改它的方法
更复杂的网站托管使用一个固定的子目录,如public
或html
或webroot
作为文档根目录,允许您隐藏敏感文件,避免通过HTTP提供服务
最佳网站托管允许您选择应作为文档根托管的子目录
在任何情况下,从脚本指向Composer autoload.php的路径都不会受到任何影响。感谢您的解释,我想我现在理解得更好了。我的web目录根在/var/www/html/
中,因此在这种情况下,建议将供应商
文件夹放在类似/var/www/vendor
的位置,然后通过相对路径访问它,对吗?没错。但是请注意,通过FTP有选择地上传该文件夹,您无法将其随意放置在任何您喜欢的位置。创建该文件夹是因为您的Composer配置