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
答案,思想,冥想和存在论据都赞赏......
答案 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
参数(只是空白)。