我们已经设置了大约二十几个内部Web应用程序。几年后的今天,我想开始使用来自外部源的包,并使用管理包的 Composer 安装项目。我以前从未需要过它,但想尝试为这些网站添加一些额外的功能。
问题是这些内部网站都没有使用/project/public_html/结构进行设置。文档根目录是 WAMP 中的主目录。
因此,DOCUMENT_ROOT目录如下所示:
c:wamp64wwwmy-site1
c:wamp64wwwmy-site2
c:wamp64wwwmy-site3
每个项目都是不同的,可能需要不同的 php 包。我希望能够使用 Composer 来管理包。
当您运行 Composer 时,会创建一个供应商文件夹。我知道,良好的实践要求我们应该把它放在这样的结构中:
C:wamp64wwwmy-project1vendor //for vendor code
C:wamp64wwwmy-project1public_html //for DOCUMENT_ROOT
但我最终得到的是:
C:wamp64wwwmy-site1vendor //for vendor code specific to site1
C:wamp64wwwmy-site2vendor //for vendor code specific to site2
是否可以使用 apache 重写规则在公共 Web 中隐藏此供应商文件夹和所有子文件夹?想法是它会拒绝输入 http://my-site1/vendor/somevendor/somefile.php 的用户,但仍允许我的脚本在需要时要求或包含和使用该目录中的文件。
或者我可以把供应商放在这里:
C:wamp64wwwvendor
然后以某种方式只包括我想要的供应商项目?并非所有供应商包都到每个项目,某种方式可以指定我想在每个站点上使用哪些类或包。
您只需将.htaccess 文件放在供应商文件夹中,其中包含:
Order allow,deny
Deny from all
供应商文件夹中的文件将无法通过在浏览器中键入 url 来访问,但可用于您的脚本。
您可以考虑使用以下文件结构将供应商保留在docroot之外:
c:wamp64wwwmy-site1
c:wamp64wwwmy-site2
c:wamp64wwwmy-site3
c:wamp64wwwvendorsmy-site1
c:wamp64wwwvendorsmy-site2
c:wamp64wwwvendorsmy-site3
在composer.json
中配置供应商目录:
"config": {
"vendor-dir": "../vendors/my-site1"
},
并在您的index.php
中包含自动加载机:
require __DIR__ . '/../vendors/my-site1/autoload.php';
如果您无法更改供应商的目录,您可以使用 mod 重写来禁止访问vendor
目录。将其放入您的主.htaccess
文件中(例如c:wamp64wwwmy-site1.htaccess
:
RewriteEngine on
RewriteRule ^vendor/(.*)?$ / [F,L]
RewriteRule ^composer.(lock|json)$ / [F,L]
在目录中使用.htaccess
也可以vendor
,但很容易意外删除此文件 - 通常vendor
目录在VCS中没有版本控制,作曲家的许多问题都可以通过"删除vendor
目录并再次运行composer install
"来解决(这也将删除您的.htaccess
并使vendor
目录可从Web访问(。
利用@wizardnx答案,您可以在运行命令后更新composer.json
以将.htaccess
文件添加到vendor
composer install
目录中,如下所示:
{
"require": {
"robmorgan/phinx": "^0.13.4"
},
"scripts": {
"post-update-cmd": [
"php -r "file_put_contents('vendor/.htaccess', 'Order allow,deny' . PHP_EOL . 'Deny from all');""
]
}
}