2

是否可以让 htaccess 查找与 url 相关的特定文件,如果找不到则返回上一步?

例子:

/示例/这里/哪里/从

Htaccess 会查看“/example/here/where/from”是否确实是某种文件(/example/here/where/from.php),如果失败,它会返回一步并检查“/example/here”是否/where' 是一个文件(/example/here/where.php)等等。

如果它必须回到树中,则将它们假设为参数,如下所示:

/example/here.php

$_GET['params'] = '哪里/来自';

提前致谢

编辑:

拼写

4

1 回答 1

3

这非常棘手,但这是一个递归遍历给定 REQUEST_URI 的父目录的代码,它支持无限深度。

通过启用 mod_rewrite 和 .htaccess httpd.conf,然后将此代码放在您.htaccessDOCUMENT_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.

RewriteRule #1 有一个正则表达式,它将当前的 REQUEST_URI 分成两部分:

  1. 除了最低的子目录之外的所有子目录$1都将在index/foo/bar这里
  2. $2将在baz这里的最低子目录

RewriteCond 检查是否%{DOCUMENT_ROOT}/$1/$2.php(转换为是否%{DOCUMENT_ROOT}/index/foo/bar/baz.php不是有效文件。

如果条件成功,则在内部将其重定向到$1/此处index/foo/bar/

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

  1. index/foo/bar/
  2. index/foo/
  3. index/

此时 RewriteCond 对规则 #1 失败,因为${DOCUMENT_ROOT}/index.php那里存在。

我的 RewriteRule #2 表示转发$1.php是否%{DOCUMENT_ROOT}/$1.php是有效文件。请注意,RewriteRule #2 具有匹配除最后一个斜杠之外的所有内容并将其放入$1. 这意味着检查是否%{DOCUMENT_ROOT}/index.php是一个有效的文件(它确实是)。

此时 mod_rewrite 处理已完成,因为此后两个 RewriteCond 都失败了,因此无法触发进一步的规则,因此%{DOCUMENT_ROOT}/index.php您的 Apache Web 服务器会及时提供服务。

于 2012-05-07T20:38:23.047 回答