1

好的。因此,我查看了类似的问题,例如this onethis 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 个目录深。

4

1 回答 1

2

修改的:

只要文件或目录存在就进行全局重定向,您可以尝试以下操作:

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !public_html  [NC]
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ /public_html/$1  [L,NC]

对于永久和可见的重定向,将 [L,NC] 替换为 [R=301,L,NC]

于 2013-03-16T08:07:06.093 回答