.htaccess规则优先级

.htaccess规则优先级,.htaccess,mod-rewrite,operator-precedence,.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参数。当我呼叫/应用程序时,会打印以下内容: Array ( [page] => app ) 当我调用/app/123或/app/123/edit时,打印内容保持不变。然

我有以下规则:

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参数。当我呼叫/应用程序时,会打印以下内容:

Array ( [page] => app )
当我调用/app/123或/app/123/edit时,打印内容保持不变。然而,当我颠倒命令的顺序时,我会得到不同的结果

对于/app/123/edit:

Array ( [page] => edit [id] => 123 )
对于/app/123:

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

为什么呢?还有,有没有办法改变这一点,因为按照从上到下的层次顺序执行命令似乎比按照相反的顺序更容易。提前感谢。

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

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

这里有一个非常方便的资源:

第二个和第三个不匹配的原因是第一个规则的输出会清除初始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。

但有一个问题:我如何才能使此部分/[0-9]+/添加?id=$1[QSA]不必在后续表达式中显式重复?id=$1表达式?问题中的第二条和第三条规则应该得到使用,因为从未指定L标志。不知道为什么他们没有,但你在这里所做的只是强迫一个,而且只有一个规则要遵守。