我为我正在开发的一个小项目创建了一个剥离框架,除了一个小问题外,一切都很顺利。
我有这样的文件夹结构:
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,它只会转到文件。我有理由这样做,这对问题并不重要,所以在任何人说“你不应该把你的文件夹设置得那样”我尝试了很多不同的方法,为了项目的目的,这是最好的方法。
答案 0 :(得分:1)
这是mod_dir做的事情,所以如果它认为请求是针对目录但是缺少尾部斜杠,它将使用尾部斜杠重定向浏览器。不幸的是,当这与内部URI重写一起发生时,重写的URI在301重定向中混淆,因此它被暴露。你必须做一个抢占式的重定向,这样mod_dir才能做到这一点。
尝试在app/webroot/
规则
RewriteCond %{DOCUMENT_ROOT}/app/webroot%{REQUEST_URI} -d
RewriteRule ^(.*[^/])$ /$1/ [R=301,L]