隐藏docroot

时间:2018-06-08 18:02:09

标签: php apache composer-php

我们已经设置了大约24个内部Web应用程序。几年后,我想开始使用来自外部资源的软件包,并使用管理软件包的Composer来安装项目。我之前从未需要它,但我想尝试为这些网站添加一些额外的功能。

问题是这些内部网站都没有设置/ project / public_html / structures。文档根目录是WAMP中的主目录。

所以DOCUMENT_ROOT目录看起来像这样:

c:\wamp64\www\my-site1\
c:\wamp64\www\my-site2\
c:\wamp64\www\my-site3\

每个项目都不同,可能需要不同的php包。我希望能够使用Composer来管理软件包。

运行Composer时,会创建供应商文件夹。我知道良好的做法要求我们应该把它放在这样的结构中:

C:\wamp64\www\my-project1\vendor  //for vendor code
C:\wamp64\www\my-project1\public_html //for DOCUMENT_ROOT

但我最终得到的是:

C:\wamp64\www\my-site1\vendor  //for vendor code specific to site1
C:\wamp64\www\my-site2\vendor  //for vendor code specific to site2

我是否可以使用apache重写规则来隐藏此供应商文件夹以及公共网络中的所有子文件夹?理念是它会拒绝用http://my-site1/vendor/somevendor/somefile.php键入但仍允许我的用户脚本在需要时要求或包含和使用该目录中的文件。

或者我可以将供应商放在这里:

 C:\wamp64\www\vendor 

然后以某种方式只包括我想要的供应商项目?并非所有供应商都包含每个项目,某种方式指定我希望在每个站点上使用哪些类或包。

2 个答案:

答案 0 :(得分:3)

您只需将.htaccess文件放在供应商文件夹中即可:

Order allow,deny
Deny from all

供应商文件夹中的文件无法通过在浏览器中输入网址来访问,但可用于您的脚本。

答案 1 :(得分:1)

您可以考虑使用以下文件结构将供应商保留在docroot之外:

c:\wamp64\www\my-site1\
c:\wamp64\www\my-site2\
c:\wamp64\www\my-site3\
c:\wamp64\www\vendors\my-site1\
c:\wamp64\www\vendors\my-site2\
c:\wamp64\www\vendors\my-site3\

composer.json中配置供应商目录:

"config": {
    "vendor-dir": "../vendors/my-site1"
},

并在index.php中包含自动加载器:

require __DIR__ . '/../vendors/my-site1/autoload.php';

如果您无法更改供应商的目录,则可以使用mod rewrite禁止访问vendor目录。将其放入主.htaccess文件(例如c:\wamp64\www\my-site1\.htaccess

RewriteEngine on

RewriteRule ^vendor/(.*)?$ / [F,L]
RewriteRule ^composer\.(lock|json)$ / [F,L]

.htaccess目录中使用vendor也会起作用,因为很容易意外删除此文件 - 通常vendor目录在VCS中没有版本化,并且编写器的许多问题都是可解决的通过“删除vendor目录并再次运行composer install”(这也将删除您的.htaccess并使vendor目录可从网络访问。