这个问题很模糊,但是,根据错误消息,您尝试做的是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