nginx proxy_pass和URL解码
原始URL:/api/URL%2F编码的%2F/?带有=查询参数 nginx: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/” 不久前,有一个相同的问题没有答案。在我看来,您应
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
,则不会进行解码。你不可能同时拥有这两样东西而不把它弄得一团糟。