我正在尝试为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,但速度较慢且不太安全。