nginx proxy_pass和URL解码

nginx proxy_pass和URL解码,nginx,Nginx,原始URL:/api/URL%2F编码的%2F/?带有=查询参数 nginx: location /api { client_max_body_size 2G; proxy_pass https://oursite; } 通过这种配置,我能够在通过代理时保留URL编码。如果我在“oursite”之后添加“/”,它将解码URL 问题: 现在被代理后的URL仍然包含“/api/”。我只需要在保留URL编码部分的同时删除“/api/” 不久前,有一个相同的问题没有答案。在我看来,您应

原始URL:/api/URL%2F编码的%2F/?带有=查询参数

nginx:

location /api {
    client_max_body_size 2G;
    proxy_pass https://oursite;
}
通过这种配置,我能够在通过代理时保留URL编码。如果我在“oursite”之后添加“/”,它将解码URL

问题:

现在被代理后的URL仍然包含“/api/”。我只需要在保留URL编码部分的同时删除“/api/”


不久前,有一个相同的问题没有答案。在我看来,您应该修改api以避免出现如此奇怪的URL。另一种方法是在子域上使用apiAlexey Ten 2015年3月11日22:58

stackoverflow.com/q/28684300/1016033–Alexey Ten 2015年3月11日23:01

岁的挑战接受了

    location /api/ {
        rewrite ^ $request_uri;
        rewrite ^/api/(.*) $1 break;
        return 400;
        proxy_pass http://127.0.0.1:82/$uri;
    }
就这样,伙计们

更多详细信息,请参阅,但它甚至可以用于查询字符串:

%  curl "localhost:81/api/url%2Fencoded%2F/?with=queryParams"
/url%2Fencoded%2F/?with=queryParams
%

如果我使用带中断的重写,它会重新解码。很久以前,有一个相同的问题没有答案。在我看来,您应该修改api以避免出现如此奇怪的URL。另一种方法是在子域上使用api。@AlexeyTen,我有答案了!有没有可能获得一些选票?:-)@肖伯林,平!我在这里非常努力地寻找答案,你能不能花点时间来决定它是否回答了你的问题?对于没有嵌套路径的人,
location/{proxy\u passhttp://127.0.0.1$request_uri;}
有效fine@diachedelic,查看中的最后一个控制组-您的示例中的
$request\u uri
是多余的。您是对的,我的错误是添加了一个类似于
代理\u pass的斜杠http://127.0.0.1/;导致nginx规范化路径(此处文档中提到:)的原因与CentOS 6.4和nginx 1.10.2上的问题相同。这个答案解决了这个问题。现在我想知道最新版本的nginx(1.13.9)是否仍然有这种行为。这似乎是一个解决办法,而不是Nginx的经典配置…@MaX,看看链接的trac问题;您建议的选项将存在安全风险,因此,不提供它是nginx的经典配置。这方面的用例非常有限,当它真的出现时,上面的解决方法是100%可行的,是最好的选择,真的。(感谢您的支持。)顺便说一句,如果您不修改
$uri
,则不会进行解码。你不可能同时拥有这两样东西而不把它弄得一团糟。