Apache的复杂框架结构

时间:2014-02-27 21:40:41

标签: php apache .htaccess mod-rewrite

我正在尝试为PHP中的模块化应用程序创建mod_rewrite规则。我知道如何从PHP中解决问题,但我想尽可能避免通过PHP提供文件。

基本上我有一个公共Web根目录和一个单独的应用程序目录和模块目录。在模块内部,每个模块都有一个单独的目录,在那里还有一个公共目录。我想首先在公共场所提供文件。另外,我想从模块的公共文件中提供服务。上述两种方法都失败了将请求传递给路由器脚本。如果资源存在但是是dir,我想尝试提供它的索引页面。最后,我不想提供自动生成的索引,我想使用外部重定向来删除请求中的尾部斜杠。

我将举例说明我正在努力实现的目标。

注意:在以下示例中,“/”映射到公共apache目录,/path/to/app/映射到位于apache public目录之外的目录。 “mymodule”符合/[a-zA-z][a-zA-z0-9_.-]*/。另外,如果可能的话,我想指定/path/to/app/作为相对路径。

  • 示例1,没有模块名称:

    • 如果用户请求:/myresource.txt
    • 如果存在,则
    • 应该投放:/myresource.txt
    • 其他服务:/index.php
  • 示例2,模块名称为:

    • 如果用户请求:/mymodule/myresource.txt
    • 如果存在,则
    • 应该投放:/mymodule/myresource.txt
    • 如果存在,则提供其他服务:/path/to/app/modules/mymodule/public/myresource.html
    • 其他服务:/index.php
  • 示例3,包含模块名称和子目录:

    • 如果用户请求:/mymodule/subdir/myresource.txt
    • 如果存在,则
    • 应该投放:/mymodule/subdir/myresource.txt
    • 如果存在,则提供其他服务:/path/to/app/modules/mymodule/public/subdir/myresource.html
    • 其他服务:/index.php
  • 示例4,包含模块名称和两个子目录:

    • 如果用户请求:/mymodule/subdir1/subdir2/myresource.txt
    • 如果存在,则
    • 应该投放:/mymodule/subdir1/subdir2/myresource.txt
    • 如果存在,则提供其他服务:/path/to/app/modules/mymodule/public/subdir1/subdir2/myresource.html
    • 其他服务:/index.php
  • 示例5,请求目录路径:

    • 如果用户请求:/mymodule/
    • 如果存在,则
    • 应该投放:/mymodule/index.php
    • 如果存在,则提供其他服务:/mymodule/index.html
    • 如果存在,则提供其他服务:/mymodule/index.htm
    • 如果存在,则提供其他服务:/path/to/app/modules/mymodule/public/index.php
    • 如果存在,则提供其他服务:/path/to/app/modules/mymodule/public/index.html
    • 如果存在,则提供其他服务:/path/to/app/modules/mymodule/public/index.htm
    • 其他服务:/index.php

更多例子:

/path/to/app/
    modules/
        first_module/
            SomeClass.php             <-- Not accesible from the web
            public/
                some_script.js        <-- accesible as /first_module/some_script.js
                some_img.jpg          <-- accesible as /first_module/some_img.jpg
                index.php             <-- accesible as /first_module
        second_module/
            AnotherClass.php          <-- Not accesible from the web
            public/
                scripts/
                    some_script.js    <-- accesible as /second_module/scripts/some_script.js
                images/
                    some_img.jpg      <-- accesible as /second_module/images/some_img.jpg
                styles/
                    a_style.css       <-- NOT ACCESIBLE, shadowed by a file in the web root
                static.html           <-- accesible as /second_module/static.html
    public/
        scripts/
            another_script.js        <-- accesible as /scripts/another_script.js
        notAmodule/
            index.php                 <-- accesible as /notAmodule
        second_module/
            styles/
                a_style.css           <-- shadows a module file, accesible as /second_module/styles/a_style.css
        index.php                     <-- EVERYTHING ELSE REDIRECTS HERE

请注意,请求:

/first_module投放/path/to/app/modules/first_module/public/index.php

但请求:

/second_module投放/path/to/app/public/index.php

我遇到的主要问题不是重写规则 - 我确实很难 - 但是,如何告诉Apache在Web根目录之外提供文件?我怀疑这正是Apache预计不会做的事情。一个简单的替代方法是将模块的公共文件放在Web根目录中,但我不想将模块代码与其静态文件分开。另一种方法是将模块的代码放在Web根目录中,但这更不可取。

符号链接可以让我99%,但它们不是一个优雅的解决方案,他们无论如何也无法在我的托管服务中工作。符号链接很脆弱,如果我更改了模块名称并且可能会破坏迁移,它们就会中断。

除了没有任何工作让我在每个站点上影响模块文件,我确信这个功能会派上用场。

这可能吗?

PS:我知道我可以使用PHP和readfile,但速度较慢且不太安全。

0 个答案:

没有答案