Mod重写- .htaccess规则优先级



我有以下规则:

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/编辑:

Array ( [page] => edit [id] => 123 )
/应用程序/123:

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

为什么?还有,是否有办法改变这种情况,因为按照自上而下的层次顺序执行命令似乎更容易,而不是相反。

在这种情况下,你必须使用"end of string"符号$:

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行。

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

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。

最新更新