【问题标题】:Nginx Replace Query string redirectNginx 替换查询字符串重定向
【发布时间】:2019-01-03 19:22:01
【问题描述】:

我们之前在 apache 上运行并使用以下代码重定向/替换我们的查询参数之一。

RewriteCond %{QUERY_STRING} ^limit=(.*)$ [NC]
RewriteRule ^ %{REQUEST_URI}?product_list_limit=%1 [L,R=301]

这将成功重定向以下 URL

www.example.com/clothing.html?limit=all

www.example.com/clothing.html?product_list_limit=all

我使用了一个生成以下内容的 htaccess 重定向转换器。这不起作用

    location ~ / {
    if ($query_string ~* "^limit=(.*)$"){
        rewrite ^(.*)$ /$request_uri?product_list_limit=%1 redirect;
    }
}

任何帮助表示赞赏

谢谢

【问题讨论】:

    标签: regex redirect nginx


    【解决方案1】:

    您不应该使用$request_uri 来构造重写的 URI,因为它还包含 ?limit=all - 所以您重写的 URI 看起来像:/clothing.html?limit=all?product_list_limit=all

    rewrite 语句重置数字捕获,因此您需要在if 语句中使用命名捕获。

    不带查询字符串的 URI 可用作 $uri 或从 rewrite 语句的正则表达式中捕获。

    以下任何一种形式都适合您:

    if ($query_string ~* "^limit=(?<limit>.*)$") {
        rewrite ^(.*)$ $1?product_list_limit=$limit? redirect;
    }
    

    注意尾随 ? 以防止附加原始查询字符串。请参阅this document 了解更多信息。

    或者:

    if ($query_string ~* "^limit=(.*)$") {
        return 302 $uri?product_list_limit=$1;
    }
    

    limit 参数的值也可以作为 $arg_limit,所以你也可以使用这个:

    if ($arg_limit) {
        return 302 $uri?product_list_limit=$arg_limit;
    }
    

    详情请见this document

    【讨论】:

      猜你喜欢
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 2018-03-15
      • 2017-06-02
      • 2016-07-12
      • 2019-06-17
      • 2017-04-10
      相关资源
      最近更新 更多