可以让htaccess查找与该网址相关的特定文件,如果找不到则返回一步?
示例:
/example/here/where/from
Htaccess查看'/ example / here / where / from'是否确实是某种文件(/example/here/where/from.php)如果失败则返回一步并检查是否''/ example / here / where'是一个文件(/example/here/where.php)等等。
如果必须返回树中,请将它们视为参数:
/example/here.php
$ _ GET ['params'] ='where / from';
提前致谢
修改
拼写
答案 0 :(得分:3)
这非常棘手但是这里是一个递归遍历给定REQUEST_URI的父目录的代码,它支持无限深度。
通过httpd.conf
启用mod_rewrite和.htaccess,然后将此代码放在.htaccess
目录下的DOCUMENT_ROOT
中:
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
# If the request is for a valid file
RewriteCond %{REQUEST_FILENAME} -f [OR]
# If the request is for a valid link
RewriteCond %{REQUEST_FILENAME} -l
# don't do anything
RewriteRule ^ - [L]
# if current ${REQUEST_URI}.php is not a file then
# forward to the parent directory of current REQUEST_URI
RewriteCond %{DOCUMENT_ROOT}/$1/$2.php !-f
RewriteRule ^(.*?)/([^/]+)/?$ $1/ [L]
# if current ${REQUEST_URI}.php is a valid file then
# load it be removing optional trailing slash
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*?)/?$ $1.php [L]
假设原始URI是:/index/foo/bar/baz
。另外,假设%{DOCUMENT_ROOT}/index.php
存在但DOCUMENT_ROOT
下没有其他php文件。
RewriteRule#1有一个正则表达式,它将当前的REQUEST_URI分为两部分:
$1
以外的所有但最低的子网址index/foo/bar
$2
,此处为baz
RewriteCond会检查%{DOCUMENT_ROOT}/$1/$2.php
(转换为%{DOCUMENT_ROOT}/index/foo/bar/baz.php
) NOT 是否为有效文件。
如果条件成功,那么它会在内部重定向到$1/
index/foo/bar/
。
RewriteRule#1的逻辑再次重复,使REQUEST_URI为(每次递归后):
index/foo/bar/
index/foo/
index/
此时RewriteCond因规则#1失败,因为那里存在${DOCUMENT_ROOT}/index.php
。
如果$1.php
是有效文件,我的RewriteRule#2会转发%{DOCUMENT_ROOT}/$1.php
。请注意,RewriteRule#2的正则表达式匹配除了最后一个斜杠之外的所有内容并将其放入$1
。这意味着检查%{DOCUMENT_ROOT}/index.php
是否是有效文件(确实如此)。
此时mod_rewrite处理已完成,因为在此之后RewriteCond都失败,因此无法触发进一步的规则,因此您的Apache Web服务器可以正常提供%{DOCUMENT_ROOT}/index.php
。