nginx转发实现跨域下载重命名文件

11月 28, 2017

我们将文件上传到阿里OSS,用随机字符串命名(如“c7e282b1c79be5e9”),存到数据库就是一个文件的相对路径和文件信息。直接下载下来文件名就是一串随机字符串,文件多的话就不直观,难以查找。

我们想到下载的时候重命名,用a标签。例如

1
<a href="https://cdn.xxx.com/img/c7e282b1c79be5e9.jpg" download="小狗.jpg">

因为oss是单独的域名访问,跨域a标签的download重命名就失效了。

这里提供一个解决方法是配置nginx转发,把文件的相对路径作为参数,访问当前域名的一个路径。

我们希望访问

1
https://www.xxx.com/cdn?url=img/c7e282b1c79be5e9.jpg

就能访问到

1
https://cdn.xxx.com/img/c7e282b1c79be5e9.jpg

可以在nginx这么配置

1
2
3
4
location /cdn {
resolver 119.29.29.29 114.114.114.114;
proxy_pass $arg_url;
}

但这样对有些浏览器可能不太支持,比如Safari,更进一步可以这样,原因是带了参数,我们可以改造成一个绝对路径。比如:

1
https://www.xxx.com/cdn/img/c7e282b1c79be5e9.jpg

这样nginx需要这么配置

1
2
3
4
location /cdn {
resolver 119.29.29.29 114.114.114.114;
proxy_pass https://cdn.xxx.com/;
}