一个url重写规则,适用于6个场景

时间:2011-06-08 10:26:30

标签: php regex apache url-rewriting

我有一个适用于我的索引页的重写规则

RewriteRule ^index$ index.php [L]
RewriteRule ^index/$ index.php [L]
RewriteRule ^index/page/(0?[1-9]|1[0-2])$ index.php?recordstart=$1 [L]
RewriteRule ^index/page/(0?[1-9]|1[0-2])/$ index.php?recordstart=$1 [L]

我有6页有类似情况。

例如

RewriteRule ^graduate$ graduate.php [L]
RewriteRule ^graduate/$ graduate.php [L]
RewriteRule ^graduate/page/(0?[1-9]|1[0-2])$ graduate.php?recordstart=$1 [L]
RewriteRule ^graduate/page/(0?[1-9]|1[0-2])/$ graduate.php?recordstart=$1 [L]

我正在寻找一个可以匹配六个确切场景的重写,而不是重复四行六次。

由于

4 个答案:

答案 0 :(得分:2)

类似的东西:

RewriteRule ^(scenario1|scenario2|scenario3)$ $1.php [L]
RewriteRule ^(scenario1|scenario2|scenario3)/$ $1.php [L]
RewriteRule ^(scenario1|scenario2|scenario3)/page/(0?[1-9]|1[0-2])$ $1.php?recordstart=$2 [L]
RewriteRule ^(scenario1|scenario2|scenario3)/page/(0?[1-9]|1[0-2])/$ $1.php?recordstart=$2 [L]

感觉很脏,但如果你想排除所有其他情况,除了提到的情况。

编辑:我也会在此处添加,您可以通过在/之后选中?来删除2行规则,它将匹配或没有尾随/。解决方案将成为:

   RewriteRule ^(scenario1|scenario2|scenario3)/?$ $1.php [L]
   RewriteRule ^(scenario1|scenario2|scenario3)/page/(0?[1-9]|1[0-2])/?$ $1.php?recordstart=$2 [L]

答案 1 :(得分:2)

RewriteRule ^(index|graduate)/?$ $1.php [L]
RewriteRule ^(index|graduate)/page/(0?[1-9]|1[0-2])/?$ $1.php?recordstart=$2 [L]

|(管道)在正则表达式中用于提供替代方案,实际上它意味着“或”。您可以使用|添加任意数量的值。

如果您知道自己在做什么,也可以使用^([a-zA-Z]+)/?$,但这意味着您的规则会捕获仅包含英文字母的每个值。你必须处理错误。

我通过在最后添加/?来简化您的规则,这意味着可选的结束斜杠。

答案 2 :(得分:2)

首先,为了节省一些空间,你可以将前四个规则缩短为两个:

RewriteRule ^index(/|)$ index.php [L]
RewriteRule ^index/page/(0?[1-9]|1[0-2])(/|)$ index.php?recordstart=$1 [L]

然后你可以修改这两行:

RewriteRule ^(page1|page2|page3|page4|page5|page6)(/|)$ $1.php [L]
RewriteRule ^(page1|page2|page3|page4|page5|page6)/page/(0?[1-9]|1[0-2])(/|)$ $1.php?recordstart=$1 [L]

答案 3 :(得分:0)

这是否有效(未经测试)?

RewriteRule ^(index|graduate|...)$ $1.php [L]
RewriteRule ^(index|graduate|...)/$ $1.php [L]
RewriteRule ^(index|graduate|...)/page/(0?[1-9]|1[0-2])$ $1.php?recordstart=$2 [L]
RewriteRule ^(index|graduate|...)/page/(0?[1-9]|1[0-2])/$ $1.php?recordstart=$2 [L]

我认为您还可以将规则减少到以下内容:

RewriteRule ^(index|graduate|...)/?$ $1.php [L]
RewriteRule ^(index|graduate|...)/page/(0?[1-9]|1[0-2])/?$ $1.php?recordstart=$2 [L]