这个问题很模糊,但是,根据错误消息,您尝试做的是proxy_pass完全基于用户输入,通过使用/image/URI 前缀后指定的完整 URL 来执行。
基本上,这是一个非常糟糕的主意,因为您正在开放自己以成为开放代理。但是,它不像您提供的 conf 那样工作的原因是由于 URL 规范化,在您的情况下,它压缩http://example为http:/example(双斜杠变为单斜杠),这在proxy_pass.
如果您不关心安全性,您可以merge_slashes从默认更改on为off:
merge_slashes off;
location …
另一种可能性是与nginx proxy_pass 和 URL 解码有些相关
location ~ ^/image/.+ {
rewrite ^ $request_uri;
rewrite ^/image/(.*) $1 break;
return 400;
proxy_pass $uri; # will result in an open-proxy, don't try at home
}
正确的解决方案是实施白名单,可能借助map甚至基于前缀的位置指令:
location ~ ^/image/(http):/(upload.example.org)/(.*) {
proxy_pass $1://$2/$3;
}
请注意,根据开头的说明,上面的位置以设置为准,因此默认情况下merge_slash它永远不会有双精度,因此需要在阶段手动添加双精度。////proxy_pass