好的。因此,我查看了类似的问题,例如this one和this one,但是,虽然它们确实有所帮助,但我仍然遇到了最后一个问题。
假设我们有以下 URL:
http://playground.dev/projects/project1
http://playground.dev/projects/project1/work
http://playground.dev/projects/project1/work/1.txt
假设我们有以下目录结构:
/var/www
- projects/
-- project1/
--- public_html/
---- index.html
---- work/
----- 1.txt
我的目标是编写一个通用的 .htaccess 文件,该文件将存在于每个项目(project1、project2 等)的“根”中,并将上述 URL 映射到它们相应的文件和目录。
现在,我几乎想通了:
RewriteEngine On
RewriteRule ^public_html - [L]
RewriteRule ^(.*)$ public_html/$1
这让我得到了我想要的。上述 URL 都按预期映射,并且大多数异常值/错误输入都被正确处理为 4xx;但是,有一个小故障:Apache 接受像下面这样的 URL。
http://playground.dev/projects/project1/work/1.txt/fgdgfgfdgfdgd
不,fgdgfgfdgfdgd
不存在,“1.txt”也不是一个目录,但 Apache 不仅允许这种可憎的行为在没有 404 的情况下继续进行,而且以某种方式设法传递到“1.txt”文件,就好像我输入的 URL 是http://playground.dev/projects/project1/work/1.txt
.
当我删除 .htaccess 文件并在完整路径上尝试相同的操作时,不会发生这种情况。apache 文档没有什么亮点,而谷歌正在溅射。也许我累了,错过了什么……但这里到底发生了什么?
让我更具体一点:
URL 的组成如下:http://playground.dev/projects/{projectname}{path}
其中 {projectname} 和 {path} 不仅都是变量(尽管 projectname 只是一个目录),而且 {path} 可能存在也可能不存在,可能是也可能不是 3 个目录深,甚至可能有 300 个目录深。