使用nginx解决前端js下载跨域问题
作者:只因黑子刘老六
订单系统增加附件预览,下载的功能,但是这个附件是客户推单时推送过来的,文件连接是类似oss连接,但是是客户的域名,所以导致跨域问题,本文小编将给大家介绍如何用nginx解决前端js下载跨域问题,需要的朋友可以参考下
背景
订单系统增加附件预览 , 下载的功能,但是这个附件是客户推单时推送过来的,文件连接是类似oss连接,但是是客户的域名,所以导致跨域问题.
前端是vue项目
解决过程
1.面向百度编程
先百度了一番
基本都是说用 blob 这个我真不太了解,但是在项目里找到了别人写的下载方法,也是用的blob,但是根本解决不了跨域问题.
2.摆烂
百度一番没找到解决办法,于是打算摆烂
附件预览界面大约长这样子,直接鼠标在链接上面右键另存为可以下载附件
于是改造了一下原来的下载方法 增加个友好提示
downloadFile(url) { const fileName = this.getFilenameFromUrl(url); // 文件名 const xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'blob'; const _this = this xhr.onload = function () { if (this.status === 200) { const blob = new Blob([this.response], {type: 'application/octet-stream'}); const link = document.createElement('a'); link.href = window.URL.createObjectURL(blob); link.download = fileName; document.body.appendChild(link); link.click(); document.body.removeChild(link); } }; // 增加友好提示 下载失败让用户右键另存为 xhr.onerror = function (){ _this.$modal.msgError("下载失败,请尝试在链接上使用右键另存为"); } xhr.send(); }
3.重新出发
增加友好提示以后,同事都要被我笑死了,这种方式简直low爆了
于是我想到用nginx反向代理来解决这个问题
继续百度
找到一篇地址
用本地nginx试了一下
location /download { if ($query_string ~* ^(.*)url=(.*)$){ set $imageUrl $2; proxy_pass $imageUrl; } }
修改下载方法
downloadFile(url) { const fileName = this.getFilenameFromUrl(url); // 文件名 const xhr = new XMLHttpRequest(); const newUrl = 'http://localhost/download?url=' + url xhr.open('GET', newUrl, true); xhr.responseType = 'blob'; const _this = this xhr.onload = function () { if (this.status === 200) { const blob = new Blob([this.response], {type: 'application/octet-stream'}); const link = document.createElement('a'); link.href = window.URL.createObjectURL(blob); link.download = fileName; document.body.appendChild(link); link.click(); document.body.removeChild(link); } }; xhr.onerror = function (){ _this.$modal.msgError("直接下载失败,请尝试在链接上使用右键另存为"); } xhr.send(); }
居然成功了,可以下载文件, 于是修改了一下 上测试服务器
最终版js
downloadFile(url) { const fileName = this.getFilenameFromUrl(url); // 文件名 const xhr = new XMLHttpRequest(); const newUrl = window.location.protocol + '//' + window.location.hostname + '/download?url=' + url xhr.open('GET', newUrl, true); xhr.responseType = 'blob'; const _this = this xhr.onload = function () { if (this.status === 200) { const blob = new Blob([this.response], {type: 'application/octet-stream'}); const link = document.createElement('a'); link.href = window.URL.createObjectURL(blob); link.download = fileName; document.body.appendChild(link); link.click(); document.body.removeChild(link); } }; xhr.onerror = function (){ _this.$modal.msgError("直接下载失败,请尝试在链接上使用右键另存为"); } xhr.send(); }
4.新问题
上测试服务器后发现按下载按钮还是失败,发现居然报502
翻了一下nginx的报错日志
no resolver defined to resolve ........
百度了一下
原来nginx代理的地址如果是域名的话 需要增加dns解析 nginx并不会直接用系统的dns
location /download { resolver 你的dns; if ($query_string ~* ^(.*)url=(.*)$){ set $imageUrl $2; proxy_pass $imageUrl; } }
设置完 resolver 后 再试 果然成功了
以上就是使用nginx解决前端js下载跨域问题的详细内容,更多关于nginx解决js下载跨域的资料请关注脚本之家其它相关文章!