2

我为我正在处理的一个小项目创建了一个剥离框架,一切都很好,除了一个小问题。

我有这样的文件夹结构:

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文件,这意味着人们去http://example.com/misc理想情况下不会重写 URL,它只会去文件。我这样做的原因对这个问题并不重要,所以在任何人说“你不应该这样设置你的文件夹”之前,我已经尝试了许多不同的方法,为了项目的目的,这是最好的方法。

4

1 回答 1

1

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

尝试在app/webroot/规则之前添加它

RewriteCond %{DOCUMENT_ROOT}/app/webroot%{REQUEST_URI} -d
RewriteRule ^(.*[^/])$ /$1/ [R=301,L]
于 2012-08-12T16:53:14.963 回答