gpt4 book ai didi

nginx - 如何让 nginx 重定向到 url 编码的查询参数

转载 作者:行者123 更新时间:2023-12-02 16:19:33 26 4
gpt4 key购买 nike

我需要根据示例对通过查询参数传递的 url 进行代理调用:我的 nginx 代理部署在:https://myproxy.net

如果重定向参数不是 url 编码的,我可以用这个 block 进行调用:

  location /basepath {
if ( $arg_redirect = '') {
return 400 "Missing redirect directive in request";
}
proxy_pass $arg_redirect;
proxy_intercept_errors on;
error_page 301 302 307 = @handle_redirects;
}

错误拦截和@handle_redirects 然后处理可能在新目的地弹出的其他 30X 代码。
这适用于请求:
GET: https://myproxy.net/basepath?redirect=https://destination.com/somepath/uuid

我需要做什么才能使其适用于:
GET: https://myproxy.net/basepath?redirect=https%3A%2F%2Fdestination.com%2Fsomepath%2Fuuid

此外,作为规范的一部分,它必须是纯 nginx,而不是附加模块、lua 等。谢谢!

最佳答案

实际上,proxy_pass默认做归一化,但它只影响$uri部分。因此,您只需要解码传递的字符串的开头即可使其正常工作:

  location / {
if ( $arg_redirect = '') {
return 400 "Missing redirect directive in request";
}
if ( $arg_redirect ~ (.+)%3A%2F%2F(.+) ){ # fix :// between scheme and destination
set $arg_redirect $1://$2;
}
if ( $arg_redirect ~ (.+?)%3A(.*) ){ # fix : between destination and port
set $arg_redirect $1:$2;
}
if ( $arg_redirect ~ (.+?)%2F(.*) ){ # fix / after port, the rest will be decoded by proxy_pass
set $arg_redirect $1/$2;
}
proxy_pass $arg_redirect;
}

通过以上我设法访问了http://localhost/?redirect=http%3A%2F%2F127.0.0.1%3A81%2Fsfoo%20something%2Fs

该解决方案似乎很脏,使用默认模块的唯一替代方案是 map(我认为更不干净)。我宁愿将 redirect 参数分成几个部分:方案(http 或 https)、目标、端口和 uri。这样你就可以在不重写的情况下构建完整的地址:

proxy_pass $arg_scheme://$arg_dest:$arg_port/$arg_uri

关于nginx - 如何让 nginx 重定向到 url 编码的查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65837046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com