.htaccess规则优先级

时间:2013-01-20 17:20:01

标签: .htaccess mod-rewrite operator-precedence

我有以下规则:

RewriteRule ^app ?page=app [QSA]
RewriteRule ^app/([0-9]+) ?page=app&id=$1 [QSA]
RewriteRule ^app/([0-9]+)/edit ?page=edit&id=$1 [QSA]

我的页面打印了GET参数。当我拨打/ app时,会打印以下内容:

Array ( [page] => app )

当我调用/ app / 123或/ app / 123 / edit时,打印效果保持不变。但是,当我颠倒命令的顺序时,我会得到不同的结果。

对于/ app / 123 / edit:

Array ( [page] => edit [id] => 123 )

对于/ app / 123:

Array ( [page] => app [id] => 123 )

为什么?此外,是否有一种方法可以改变它,因为从上到下的层次顺序,而不是相反的方式,更容易进行命令。提前谢谢。

2 个答案:

答案 0 :(得分:3)

在这种情况下,您必须使用“字符串结尾”符号$

RewriteRule ^app$ ?page=app [QSA]
RewriteRule ^app/([0-9]+)$ ?page=app&id=$1 [QSA]
RewriteRule ^app/([0-9]+)/edit$ ?page=edit&id=$1 [QSA]

否则,由于您的第一个exp与所有URL表单匹配,因此始终使用它,并且规则检查永远不会使其到达第2行。

答案 1 :(得分:0)

这是一个非常方便的资源:

http://martinmelin.se/rewrite-rule-tester/

第二个和第三个规则不匹配的原因是第一个规则的输出清除了初始URI。

您想要的实际规则是:

RewriteRule ^(app/?.*) $1?page=app [QSA]
RewriteRule ^(app/([0-9]+)/?.*) $1?page=app&id=$2 [QSA]
RewriteRule ^(app/([0-9]+)/edit) $1?page=edit&id=$2 [QSA]

在上面的测试页面上使用app / 123 / edit进行测试显示所有匹配的规则并应用为:

#   Match?  Rule    Resulting URL
1   yes RewriteRule ^(app/?.*) $1?page=app [QSA]    app/123/edit?page=app
2   yes RewriteRule ^(app/([0-9]+)/?.*) $1?page=app&id=$2 [QSA] app/123/edit?page=app?page=app&id=123
3   yes RewriteRule ^(app/([0-9]+)/edit) $1?page=edit&id=$2 [QSA]   app/123/edit?page=edit&id=123

我认为测试人员没有正确处理QSA标志。我只需要在每个规则中指定新的键/值对,而不必重述前一个。 QSA应合并它们。您的规则中的真正错误是不保留URI。