删除 nginx 中带有编码值的路径段

删除 nginx 中带有编码值的路径段

我有location如下块

location ^api/([^/]+)(/.+)$ {
     set $my_host $1;
     set $my_path $2;
     proxy_pass http://$myhost$my_path$is_args$args;
}

这对于大多数正常 URI 情况都很有效,例如/api/foo/bar?1234

但是,当我引入特殊的 URL 编码值时,事情就变糟了。当 URI 为 时/api/foo/bar[%7B%7D]$my_path会被解码并传递为$my_host/foo/bar[{}]这不是有效的 URL。

我尝试通过使用条件匹配和来解决 NGINX 的限制$request_uri$uri但结果要么是双重编码,要么是未编码。

location ~* ^api/([^/]+)(/.+)$ {
     set $my_host $1;
     if ( $request_uri ~* ^api/([^/]+)(/.+)$ ) {
          set $my_path $2;
     }
     proxy_pass http://$myhost$my_path$is_args$args;
}

在上面的例子中$my_path/foo/bar[%257B%257D]

我还尝试使用set_unescape_uriset misc 模块作为第二个正则表达式。

我怎样才能让 NGINX 以与客户端提供的相同格式删除路径组件?

答案1

我猜想 regex 变量或其他东西出了问题set_unescape_uri。使用单个参数形式有效set_unescape_uri

location ~* ^api/([^/]+)(/.+)$ {
     set $my_host $1;
     if ( $request_uri ~* ^api/([^/]+)(/.+)$ ) {
          set $my_path $2;
          set_unescape_uri $my_path;
     }
     proxy_pass http://$myhost$my_path$is_args$args;
}

相关内容