当重定向到更深的子目录时,mod_rewrite .htaccess在深子目录中的奇怪行为

时间:2013-03-16 06:59:58

标签: apache .htaccess mod-rewrite redirect

确定。所以,我已经看过类似的问题,例如this onethis one,但是,虽然他们肯定有所帮助,但我仍然会遇到最后一期。

假设我们有以下网址:
http://playground.dev/projects/project1 http://playground.dev/projects/project1/work http://playground.dev/projects/project1/work/1.txt

假设我们有以下目录结构:

  

/ var / www
   - 项目/
   - project1 /
  --- public_html /
  ---- index.html
  ----工作/
  ----- 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”文件,就像我输入的网址是http://playground.dev/projects/project1/work/1.txt

当我删除.htaccess文件并在完整路径上尝试相同的操作时,不会发生这种情况。阿帕奇文档几乎没有什么亮点,谷歌正在蠢蠢欲动。也许我累了,错过了什么......但是这里发生了什么?

让我更具体一点:

URL的组成如下:http://playground.dev/projects/{projectname}{path}其中{projectname}和{path}不仅都是变量(虽然projectname只是一个目录),但{path}可能存在也可能不存在,或者可能不是3个目录深,或者甚至可能是300个目录深。

1 个答案:

答案 0 :(得分: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]