缩短/压缩mod_rewrite规则

时间:2013-04-25 09:44:33

标签: .htaccess mod-rewrite

在我的规则中,我有......

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

答案,思想,冥想和存在论据都赞赏......

1 个答案:

答案 0 :(得分: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参数(只是空白)。