2009-09-16 80 views
0

我使用apache的mod_rewrite来使我的应用程序的URL很漂亮。我掌握了mod_rewrite的基础知识 - 我的应用程序的几个部分使用简单和可预测的重写。用mod_rewrite处理多个可选参数

但是,我写了一个博客功能,它使用了几个不同的参数。

http://www.somedomain.com/blog/ 
http://www.somedomain.com/blog/tag/ 
http://www.somedomain.com/blog/page/2/ 

,我有以下规则在我的.htaccess:

RewriteRule ^blog/ index.php?action=blog [NC] 
RewriteRule ^blog/(.*) index.php?action=blog&tag=$1 [NC] 
RewriteRule ^blog/page/(.*) index.php?action=blog&page=$1 [NC] 

但是,规则不在一起工作。计算机符合第一条规则,然后停止处理 - 尽管以我的思维方式,它不应该匹配。我告诉机器要匹配^blog/,它会继续,并匹配^blog/tag/^blog/page/2/,这对我来说似乎是错误的。

我的规则出了什么问题?为什么他们没有按照我的意图进行评估?

编辑:答案是终止使用$输入,并重新排序的规则,非常轻微:

RewriteRule ^blog/$ index.php?action=blog [NC,L] 
RewriteRule ^blog/page/(.*)$ index.php?action=blog&page=$1 [NC,L] 
RewriteRule ^blog/(.*)$ index.php?action=blog&tag=$1 [NC,L] 

这些规则产生预期的效果。

回答

2

如果你不想做^blog/匹配什么比这更,指定在比赛中输入的结束还有:

^blog/$ 

然而,这样许多应用程序做到这一点是只是有一个所有URL重定向到的单个页面,然后在页面代码内部处理剩余的URL。通常,大多数Web语言都有一种方法来获取原始请求的URI,即使Apache将它们全部指向同一页面,也可以解析该URI以确定指定了哪些“变量”。然后通过includes或其他一些框架/模板引擎,您可以加载正确的逻辑。

另一个说明 - 通常“更一般”的重写规则放在最后,以便匹配更具体的重定向的内容将首先被处理。这与规则之后的[L]选项相结合,将确保如果更具体的规则匹配,则不会评估更通用的规则。

+0

DAV,你的“输入端”的一部分是非常有益的。我会更新我的问题以反映答案。谢谢! – EvilChookie 2009-09-16 01:10:29

2

我认为你需要的[NC]语句后添加[L],否则它会继续,即使它已经匹配

+0

你是对的。我原本是把它们放在我的规则中,但把它们作为填充它的一部分。 – EvilChookie 2009-09-16 01:09:58