使用mod_rewrite处理多个可选参数

时间:2009-09-16 00:39:34

标签: apache .htaccess mod-rewrite

我正在使用apache的mod_rewrite来使我的应用程序的URL很漂亮。我有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 个答案:

答案 0 :(得分:2)

如果您不希望^blog/匹配任何内容,请在匹配项中指定输入的结尾:

^blog/$

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

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

答案 1 :(得分:2)

我认为您需要在[NC]语句后添加[L],否则即使已经匹配也会继续[/ p>