假设我有一个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中与其他参数相关的任何位置。无论如何,重定向都应该有效。
这可以实现吗?
答案 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;
}