.htaccess - 尾部斜杠打破重定向

时间:2012-08-12 09:52:04

标签: .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文件,检查请求是否是对文件或文件夹的直接请求,如果没有,则传递给index.php中的webroot文件:

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/时,这不会发生!

重点是,为了项目的目的,人们需要直接访问'misc'文件夹中的文件,那里有一个index.html文件,这意味着人们前往{{1理想情况下,不会重写URL,它只会转到文件。我有理由这样做,这对问题并不重要,所以在任何人说“你不应该把你的文件夹设置得那样”我尝试了很多不同的方法,为了项目的目的,这是最好的方法。

1 个答案:

答案 0 :(得分:1)

这是mod_dir做的事情,所以如果它认为请求是针对目录但是缺少尾部斜杠,它将使用尾部斜杠重定向浏览器。不幸的是,当这与内部URI重写一起发生时,重写的URI在301重定向中混淆,因此它被暴露。你必须做一个抢占式的重定向,这样mod_dir才能做到这一点。

尝试在app/webroot/规则

之前添加此内容
RewriteCond %{DOCUMENT_ROOT}/app/webroot%{REQUEST_URI} -d
RewriteRule ^(.*[^/])$ /$1/ [R=301,L]