我知道这是一个好主意,将PHP应用程序代码存储在公用文件夹之外,但是会产生一个问题。
比方说,我们想创build一个像这样的完全模块化的结构:
modules shop css js images controllers templates chat css js images controllers templates
显然,我们希望保护控制器和模板文件夹不受直接访问。 但是如果我们把模块放在公共文件夹之外,那么我们不能直接服务js / css / images。 我们希望避免在公共文件夹中为css / js文件创build相同模块化结构的副本。
因此,如果我们“破坏规则”并将所有模块放在公共文件夹中以允许访问css / js / images,则存在潜在的安全问题。 我们可以将.htaccess文件放在每个文件夹中,但无论如何这似乎并不安全 – 如果有人忘记添加.htaccess,该怎么办?
所以问题是: 有没有办法将模块化结构保存在一个安全的地方(如公共根之外),并且仍然允许直接访问css / js / images? 任何Apacheconfiguration,重写或一些伎俩?
直接使用控制器读取文件并将其返回,而不是直接链接到静态文件。
然后为了避免每次调用的额外开销,将文件caching在单独的caching位置。 然后,您可以使用相同的过程来cachingdynamic内容,也可以允许您dynamic地构build像css这样的东西。
例如,您可以将来自不同模块的CSS合并到一个文件中,或将可读的JavaScript更改为高度最小化的版本。
另一种方法是在每个模块中都有一个公用文件夹。 然后使用别名和/或重写规则来将请求定向到适当的位置。 使用<Directory>指令可以为文档根目录之外的文件夹设置显式权限。 这样做虽然可能会要求您每次添加模块时重新configurationApache。
像这样的东西可能会工作:
<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