2013-01-20 69 views
1

我有以下规则:的.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 PARAMS。当我打电话/应用程序,以下是印刷:

Array ([page] => app) 

当我打电话/应用/ 123或/应用/ 123 /编辑,打印保持相同。但是,当我颠倒这些命令的顺序时,我得到了不同的结果。

对于/应用/ 123 /编辑:

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

对于/应用/ 123:

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

这是为什么?另外,有没有办法改变这种情况,因为从顶部到底部的层次顺序通过命令看起来更容易,而不是相反。提前致谢。

回答

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符合所有您的网址形式,它总是使用,规则检查永远不会使其对线路2

+0

非常感谢。我会在10分钟内接受你的回答。 – arik

+0

虽然有一个问题:我怎么能让这部分/ [0-9] + /添加?id = $ 1 [QSA]部分到下面的所有页面/应用程序中,而我不必明确地重复这一点?id = $ 1表达式在随后的表达式? – arik

+0

问题中的第二条和第三条规则应该得到使用,因为从不指定L标志。不知道他们为什么不这样做,但你在这里所做的只是迫​​使一条规则被遵守。 –

0

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

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

究其原因,山高nd和third不匹配的是你的第一条规则的输出消除了最初的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] 

与测试页aboves应用程序/ 123 /编辑测试这些显示规则的所有比赛,并为适用于:

# 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 

我不t认为测试人员正在正确处理QSA标志。我只需要在每个规则中指定新的键/值对,而不必重复先前的那个(s)。 QSA应该合并它们。你的规则中真正的错误是不保存URI。