2

在我的规则中,我有..

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?page=$1&submenu=$2&info=$3&id=$4 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?page=$1&submenu=$2&info=$3 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?page=$1&submenu=$2 [QSA,L] 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/?$  index.php?page=$1 [QSA,L]

这对我来说似乎有点笨重并且重复了很多东西,关于我如何缩短它的任何想法?

我可以设置“全局”条件吗?我可以有一个这样的规则来捕获它下面的所有规则吗(我不在乎它是否通过空变量发送)

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule **clever stuff here** index.php?page=$1&submenu=$2&info=$3&id=$4 [QSA,L]

所以它会捕获

domain.com/a/b/c/d 和 domain.com/a/b/c 和 domain.com/a/b 和 domain.com/a

答案、想法、沉思和存在论都受到赞赏......

4

1 回答 1

0

如果您检查逆并让它通过重写引擎,您可以很容易地删除条件。然后你知道的任何东西都不是现有的文件或目录:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?page=$1&submenu=$2&info=$3&id=$4 [QSA,L]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?page=$1&submenu=$2&info=$3 [QSA,L]
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?page=$1&submenu=$2 [QSA,L] 
RewriteRule ^([^/\.]+)/?$  index.php?page=$1 [QSA,L]

这不是一个花哨的多重前瞻正则表达式,它可以在一行中完成所有操作,但它确实使它更易于阅读。

编辑:

好吧,就像我说的那样,您可以通过多个前瞻来做到这一点,例如:

RewriteRule ^(?:([^/.]+)|)(?:/([^/.]+)|)(?:/([^/.]+)|)(?:/([^/.]+)|) index.php?page=$1&submenu=$2&info=$3&id=$4 [QSA,L]

但它更难阅读,如果你改变一些东西,更有可能做一些意想不到的事情。此外,虽然有明确的 4 种不同的映射,但您不会像使用前瞻那样获得空白查询字符串参数。无论最后一个(?:/([^/.]+)|)是否存在,您仍然会得到一个id参数(只是空白)。

于 2013-04-25T09:50:48.853 回答