我有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_uri
set 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;
}