我知道将 php 应用程序代码存储在公共文件夹之外是一个好主意,但它会产生一个问题。
假设我们想要创建一个完全模块化的结构,如下所示:
modules
shop
css
js
images
controllers
templates
chat
css
js
images
controllers
templates
显然,我们希望保护控制器和模板文件夹不被直接访问。但是,如果我们将模块放在公共文件夹之外,那么我们就无法直接提供 js/css/images。我们希望避免在公共文件夹中仅为 css/js 文件创建相同模块结构的副本。
因此,如果我们“违反规则”并将所有模块放在公共文件夹中以允许访问 css/js/images,则存在潜在的安全问题。我们可以将 .htaccess 文件放在每个文件夹中,但无论如何这似乎并不安全 - 如果有人忘记添加 .htaccess 怎么办?
所以问题是: 有没有办法将模块化结构保存在一个安全的地方(例如公共根目录之外),同时仍允许直接访问 css/js/images?有 Apache 配置、重写规则或一些技巧吗?
答案1
不要直接链接到静态文件,而是使用控制器读取文件并返回它们。
然后,为了避免每次调用的额外开销,请将文件缓存在单独的缓存位置。然后,您可以使用相同的过程来缓存动态内容,并且它还允许您动态构建诸如 css 之类的内容。
例如,您可以将不同模块的 CSS 合并到一个文件中,或者将人类可读的 JavaScript 更改为高度最小化的版本。
另一种方法是在每个模块内设置一个公共文件夹。然后使用别名和/或重写规则将请求定向到适当的位置。使用指令,<Directory>
您可以为文档根目录之外的文件夹设置显式权限。但是,这样做可能需要您在每次添加模块时重新配置 Apache。
类似这样的方法可能会有效:
<Directory "/Docroot">
...
RewriteRule ^(shop|chat)/(.*) /path/to/modules/$1/public/$2
...
</Directory>
<DirectoryMatch "^/path/to/modules/(.+)/public">
Order Allow,Deny
Allow from All
...
</DirectoryMatch>
最后,当您“安装”模块时,您只需将公共文件复制到文档根目录中即可。您仍然可以将它们分开。如下所示:
modules
shop
controllers
templates
chat
controllers
templates
public
modules
shop
css
js
images
chat
css
js
images