如何将带有params的url从htaccess转换为ngnix



我们尝试转换以下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;
}

最新更新