Nginx重定向 - 从URL中删除特定的查询参数

时间:2014-10-15 14:13:23

标签: redirect nginx

假设我有一个URL,例如:

http://www.example.com/something.html?abc=one&def=two&unwanted=three

我想删除网址参数unwanted并保留网址的其余部分,它应该如下所示:

http://www.example.com/something.html?abc=one&def=two

此特定参数可以是URL中与其他参数相关的任何位置。无论如何,重定向都应该有效。

这可以实现吗?

3 个答案:

答案 0 :(得分:6)

你可以通过这种方式实现

if ($request_uri ~ "([^\?]*)\?(.*)unwanted=([^&]*)&?(.*)") {
    set $original_path $1;
    set $args1 $2;
    set $unwanted $3;
    set $args2 $4;
    set $args "";

    rewrite ^ "${original_path}?${args1}${args2}" permanent;
}

答案 1 :(得分:2)

我想做类似于此的事情,这里的结果被修改回原始问题的背景(正则表达式基于Milos Jovanovic的答案)

if ($request_uri ~ "([^\?]*)\?(.*)unwanted=([^&]*)&?(.*)") {
  set $args $2$4;

  rewrite "^" $scheme://$host$uri permanent;
}

这样我们只设置一个变量,如果更新的$ args为空,我们没有不需要的?在URL的末尾,因为服务器自己处理

答案 2 :(得分:0)

另一种方法是重定向客户端。

当然它只适用于 GET 或 HEAD,如果请求有正文(即:POST PUT PATCH)则无效

顺便说一句:在 fbclid 的特定情况下,地图中的第二行不是必需的,因为参数总是附加到网址


map $request_uri $redirect_fbclid {
  "~^(.*)(?:[?&]fbclid=[^&]*)$"         $1;
  "~^(.*)(?:([?&])fbclid=[^&]*)&(.*)$"  $1$2$3;
}

if ( $redirect_fbclid ) {
  return 301 $redirect_fbclid;
}