htaccess反向目录

时间:2012-05-07 19:28:34

标签: php apache .htaccess redirect

可以让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';

提前致谢

修改

拼写

1 个答案:

答案 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. $1以外的所有但最低的子网址index/foo/bar
  2. 最低的子网址为$2,此处为baz
  3. RewriteCond会检查%{DOCUMENT_ROOT}/$1/$2.php(转换为%{DOCUMENT_ROOT}/index/foo/bar/baz.php NOT 是否为有效文件。

    如果条件成功,那么它会在内部重定向到$1/ index/foo/bar/

    RewriteRule#1的逻辑再次重复,使REQUEST_URI为(每次递归后):

    1. index/foo/bar/
    2. index/foo/
    3. index/
    4. 此时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