在模块化结构的 Web 应用程序中访问公共文件

在模块化结构的 Web 应用程序中访问公共文件

我知道将 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

相关内容