0

我的配置中有以下内容作为图像的反向代理:

location ~ ^/image/(.+) {
    proxy_pass http://example.com/$1;
}

问题是并非所有图像都是 example.com 图像,因此我们需要传入完整的 url。如果我尝试:

location ~ ^/image/(.+) {
    proxy_pass $1;
}

我收到一个错误:

invalid URL prefix in "https:/somethingelse.com/someimage.png"
4

2 回答 2

0

这个问题很模糊,但是,根据错误消息,您尝试做的是proxy_pass完全基于用户输入,通过使用/image/URI 前缀后指定的完整 URL 来执行。

基本上,这是一个非常糟糕的主意,因为您正在开放自己以成为开放代理。但是,它不像您提供的 conf 那样工作的原因是由于 URL 规范化,在您的情况下,它压缩http://examplehttp:/example(双斜杠变为单斜杠),这在proxy_pass.

如果您不关心安全性,您可以merge_slashes从默认更改onoff

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

于 2017-11-23T21:58:19.613 回答
0

在这种情况下我会使用地图

map $request_uri  $proxied_url {
   # if you don't care about domain and file extension
   ~*/image/(https?)://?(.*)   $1://$2;

   # if you want to limit file extension
   ~*/image/(https?)://?(.*\.(png|jpg|jpeg|ico))$   $1://$2;
   # if you want to limit file extension and domain

   ~*/image/(https?)://?(abc\.xyz\.com/)(.*\.(png|jpg|jpeg|ico))$   $1://$2$3;
   default "/404";
}

然后在您的代理通行证部分中,您将使用如下所示的内容

location /image/ {
   proxy_pass $proxied_url;
}

我给出了三个不同的示例,具体取决于您要如何处理它

于 2017-11-24T13:19:13.420 回答