【问题标题】:How can I match query string variables with mod_rewrite?如何将查询字符串变量与 mod_rewrite 匹配?
【发布时间】:2011-01-16 04:07:02
【问题描述】:

假设我有带有如下查询字符串参数的 URL:

/index.php?book=DesignPatterns&page=139
/index.php?book=Refactoring&page=285

使用mod_rewrite,我怎样才能将它们重定向到这样的SES URL?

/DesignPatterns/139
/Refactoring/285

【问题讨论】:

    标签: regex apache mod-rewrite query-string


    【解决方案1】:
    RewriteCond %{QUERY_STRING} book=(\w+)&page=(\d+)  
    RewriteRule ^index.php /%1/%2? [L,R=301]
    

    因为RewriteRule 只查看路径(最多但不包括问号),所以使用RewriteCond 捕获查询字符串中的值。

    请注意来自RewriteCond 的匹配被捕获在%1 中, %2等,而不是$1$2等。

    还要注意RewriteRule 末尾的?。它告诉 mod_rewrite 不要将原始查询字符串附加到新 URL,因此您最终会得到 /DesignPatterns/151 而不是 /DesignPatterns/151?book=DesignPatterns&page=151.

    [L,R=301] 标志做了两件事:

    1. L 确保不会处理其他可能匹配的规则(换句话说,它确保这是处理的“最后一个”规则)。
    2. R=301 导致服务器发回重定向响应。 它不是重写,而是告诉客户端用新的重试 网址。 =301 使其成为 permanent redirect,这样搜索引擎就会知道在其索引中用新 URL 替换旧 URL。

    【讨论】:

    • 当您有多个重写规则时,您可能还需要 [L] 标志。 [L] 标志在规则匹配后停止处理,并且 [R] 标志不隐式包含它。
    • $ 与 % 对我来说是致命的。我不知道。谢谢!
    • 不将原始查询字符串附加到新 url 使用 [QSD] 标志 (httpd.apache.org/docs/2.4/rewrite/flags.html#flag_qsd)
    • 这样的答案让我希望我可以为它们加注星标,以便以后轻松查找。相反,我最终为这个问题加注了主角。
    • 这不是无效的吗?您需要使用 ^index\.php 转义 ^index.php 中的点
    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多