确定。所以,我已经看过类似的问题,例如this one和this 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个目录深。
答案 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]