开发BB平台小程序的时候,公告内容需要展示图片,但是图片地址访问时需要认证,然而微信没有一种可以修改图片访问请求的方法,所以只好反向代理一下了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
location ^~ /img {
    default_type text/html;
    # 改写url
    if ($uri ~ "/img(.*)") {
        set $r_uri "https://wlkc.ouc.edu.cn$1";
    }
    proxy_set_header Cookie $arg_cookie;
    proxy_intercept_errors on;
    error_page 301 302 = @handle_redirects;
    resolver 223.5.5.5;
    proxy_pass $r_uri;
}

location @handle_redirects {
    set $location '$upstream_http_location';
    if ($location ~ "https://wlkc.ouc.edu.cn(/.*)") {
        set $path "$1";
    }
    rewrite ^(.*)$ "https://bbh.yangyq.net/img$path";
}

通过这个配置,可以把cookie放在GET请求中,然后让nginx获取请求中的cookie,并携带这个cookie向BB平台发起请求获得图片。

由于域名还配置了接口,不能全部用来代理。所以用/img路径用来代理图片,实现效果为通过https://example.com/img/bbcswebdav/xxxxx/xxx/xxx.jpg?cookie=xxx可以携带Cookie获取到https://wlkc.ouc.edu.cn/bbcswebdav/xxxxx/xxx/xxx.jpg的内容。

浅浅记录原理

当请求访问路径以/img开头的网址时,截取/img后的内容,并获取get请求参数中的cookie,给代理设置Cookie,并且将bb平台网址与截取的路径拼接,设置为代理地址。

这时候按道理已经可以了,**但是,bb平台获取的图片地址会通过301跳转。这种情况下,直接请求就无法处理。**需要开启proxy_intercept_errors,当状态码为301时交给handle_redirects处理。handle_redirects的功能就是获取跳转的location的值,截取新的地址,并跳转到上面的img地址,再进行代理。