我正在使用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]
这些规则产生了预期的效果。
答案 0 :(得分:2)
如果您不希望^blog/
匹配任何内容,请在匹配项中指定输入的结尾:
^blog/$
然而,许多应用程序执行此操作的方式是只有一个所有URL重定向到的页面,然后在页面代码内部处理URL的其余部分。通常,大多数Web语言都有一种获取原始请求的URI的方法,可以解析该URI以确定指定了哪些“变量”,即使Apache将它们全部指向同一页面也是如此。然后通过includes
或其他框架/模板引擎,您可以加载正确的逻辑。
另外注意 - 通常将“更一般”的重写规则放在最后,以便首先处理与更具体的重定向匹配的内容。这与规则之后的[L]
选项相结合,将确保如果更具体的规则匹配,则不会评估更常规的规则。
答案 1 :(得分:2)
我认为您需要在[NC]语句后添加[L],否则即使已经匹配也会继续[/ p>