我们尝试转换以下htaccess:
RewriteCond %{QUERY_STRING} ^c=[^&]+&?(.*) [NC]
RewriteRule ^ %{REQUEST_URI}?%1 [R=301,L]
到nginx:
if ($args ~* "^c=[^&]+&?(.*)"){
set $rule_0 1;
set $bref_0_0 $1;
}
if ($rule_0 = "1"){
rewrite ^/ /$uri${bref_0_0} permanent;
}
但这会导致无休止的转发:-/
您不能以这种方式操作查询参数。相反,您可以用一个新值重新分配$args
变量:
if ($args ~* "^c=[^&]+&?(.*)") {
set $args $1;
}
这将从请求中删除c
查询参数(但前提是它是第一个查询参数(。如果您需要删除该参数,而不管它在查询字符串中的位置如何,您可以使用更复杂的regex:
if ($args ~* (.*)(^|&)c=[^&]*(2|$)&?(.*)) {
set $args $1$3$4;
}
更新
上面的配置不会执行重定向,只会从查询字符串中剥离c
查询参数。要进行重定向,请使用
if ($args ~* "^c=[^&]+&?(.*)") {
set $args $1;
return 301 $uri$is_args$args;
}
或
if ($args ~* (.*)(^|&)c=[^&]*(2|$)&?(.*)) {
set $args $1$3$4;
return 301 $uri$is_args$args;
}