0

我正在重新定义我自己的 php mvc 框架。

默认情况下,我的每个请求都由 /index.php 处理,这会触发 mvc 路由、执行请求和返回正确视图的过程。每个请求都根据单个 'q' GET 参数进行路由,drupal 风格,如

/index.php?q=anApplication/aController/theAction/arg1/.../moreArguments

这工作得很好,并且通过 mod_rewrite 使干净的 url 变得容易。好的。

我有一个这样的目录树:

/public
    |----themeName
    |--------|
             |----page.tpl
             |----content.tpl
             |----etc.    
/private
    |----sourceDirectory
    |----moreSources

不想要的是存储在私有和公共目录中的文件像 HTTP 请求一样直接提供服务:我不想要类似的东西

mySrv/public/themeName/page.tpl

绕过我的核心处理程序 - index.php 来显示死模板或任何不是图像的资源。

我想我可以通过这样的重写配置来实现一些目标

RewriteEngine on
RewriteBase /
RewriteRule  ^(.*)$ index.php?q=$1 [QSA,L]

但随后该框架将仅适用于启用 mod_rewrite 的站点,因为这将重写所有现有和不存在的资源。

我要问的是:是否有另一种方法可以让每个请求都由我选择的资源(例如 index.php)提供服务,现有或不存在的资源?

谢谢

4

2 回答 2

4

只需将所有模板等存储在 public_html 文件夹之外。

这将允许 PHP 访问,但外界无法访问该文件。

于 2012-12-12T17:39:49.540 回答
1

最简单且更便携的方法是将除您index.php之外的所有内容拉出文档根目录。PHP 仍然可以包含文件并执行其他所有操作。

我还没有尝试过,但是如果您将 index.php放在旧文档树之外

---/ app / new-index.php
   |
   / public / 
   |
   / private / ...
   |
   index.php

然后在开头添加new-index.php

<?php
    chdir('..');
    require 'index.php';
?>

最后重新配置 Apache,使 DocumentRoot 实际上变为/app,然后一切都应该像以前一样工作——除了“/”之外的任何 URL 对 Apache 不再有意义,并且所有的 URL 都可以放在合适的 ErrorDocument 404 上。

注意:“一切都应该工作”,除了HTTP 重定向。您可以从 FS 读取未解释的 PHP 文件,但不能再从本地主机上的 Apache 获取其解释的内容。此外,您应该验证任何现有代码都没有使用DOCUMENT_ROOT全局变量;如有必要,您可以覆盖它。

于 2012-12-12T17:40:48.110 回答