代码之家  ›  专栏  ›  技术社区  ›  EvilChookie

用mod重写处理多个可选参数

  •  0
  • EvilChookie  · 技术社区  · 16 年前

    我用的是阿帕奇的 mod_rewrite 使我的应用程序的URL漂亮。我有基本的 MODY重写 向下轻拍-我的应用程序的几个部分使用简单和可预测的重写。

    但是,我编写了一个blog函数,它使用了几个不同的参数。

    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 回复  |  直到 16 年前
        1
  •  2
  •   Amber    16 年前

    如果你不想 ^blog/ 要匹配更多的内容,请同时指定匹配中输入的结尾:

    ^blog/$
    

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

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

        2
  •  2
  •   Mikey    16 年前

    我想您需要在[NC]语句后添加一个[L],否则它将继续进行,即使它已经匹配

    推荐文章