2012-08-12 117 views
2

我为我正在开发的一个小型项目创建了一个剥离框架,除了一个小问题外,一切都很顺利。.htaccess - 尾部斜杠中断重定向

我的文件夹结构,如下所示:

root 
    - app 
    - controller 
    - views 
    - webroot 
     - css 
     - js 
     - img 
     - misc 
    - config 
    - data 
    - lib 

在根目录我有一个.htaccess文件,该文件的请求发送到webroot夹重定向:

RewriteEngine on 
RewriteRule  ^$  app/webroot/ [L] 
RewriteRule  (.*) app/webroot/$1 [L] 

一次,我有另一.htaccess文件检查该请求是否是文件或文件夹的直接请求,如果不是,则传递到webroot中的index.php文件:

RewriteEngine On 
RewriteCond  %{REQUEST_FILENAME} !-d 
RewriteCond  %{REQUEST_FILENAME} !-f 
RewriteCond  %{REQUEST_FILENAME} !favicon.ico$ 
RewriteRule  ^(.*)$    index.php?uri=$1  [QSA,L] 

正如我所说的,这是所有工作正常,但有一个小问题:

当你请求http://example.com/misc,它在地址栏中的地址更改为http://example.com/app/webroot/misc/

当您要求http://example.com/misc/,这不会发生!

主要的一点是,该项目的目的,人们会需要直接访问在“杂项”文件夹中的文件,在那里有一个index.html文件,这意味着人们去http://example.com/misc理想就没有重写URL,它只会去该文件。我有这样做的原因,这对于这个问题并不重要,所以在任何人走之前“你不应该让你的文件夹设置成这样”我已经尝试了很多不同的方式来做这件事,为了项目的目的,这是最好的方式来做到这一点。

回答

1

这是mod_dir正在做的事情,所以如果它认为请求是针对一个目录但缺少一个结尾的斜杠,它将301重定向浏览器的尾部斜线。不幸的是,当这种情况与内部URI重写一起发生时,重写的URI会在301重定向中混淆,因此它会被暴露。你必须做一个先发制人的重定向,以便mod_dir不会做它的事情。

尝试app/webroot/规则

RewriteCond %{DOCUMENT_ROOT}/app/webroot%{REQUEST_URI} -d 
RewriteRule ^(.*[^/])$ /$1/ [R=301,L] 
+0

奇之前添加此,我想这样做它的其他方式,加上斜杠的URL,但我从来没有想过的简单剥离/应用程序/ webroot的部分出! – 2012-08-12 19:50:02