使用nginx解决前端js下载跨域问题

 更新时间:2023年10月24日 08:58:50   作者:只因黑子刘老六  
订单系统增加附件预览,下载的功能,但是这个附件是客户推单时推送过来的,文件连接是类似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下载跨域的资料请关注脚本之家其它相关文章!

相关文章

  • Windows设置nginx开机自启动的方法

    Windows设置nginx开机自启动的方法

    这篇文章主要介绍了Windows设置nginx开机自启动的方法,通过两种方式实现nginx的开机自启动:winws和window计划程序,每种方式给大家介绍的非常详细需要的朋友可以参考下
    2022-11-11
  • nginx 配置虚拟主机,实现在一个服务器可以访问多个网站的方法

    nginx 配置虚拟主机,实现在一个服务器可以访问多个网站的方法

    下面小编就为大家分享一篇nginx 配置虚拟主机,实现在一个服务器可以访问多个网站的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Nginx worker_connections配置太低导致500错误案例

    Nginx worker_connections配置太低导致500错误案例

    这篇文章主要介绍了Nginx worker_connections配置太低导致500错误案例,需要的朋友可以参考下
    2015-04-04
  • 详解ngx_cache_purge _proxy_cache指令使用

    详解ngx_cache_purge _proxy_cache指令使用

    本文主要介绍了详解ngx_cache_purge _proxy_cache指令使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Nginx proxy_set_header参数设置

    Nginx proxy_set_header参数设置

    本文主要介绍了Nginx proxy_set_header参数设置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • 使用Nginx搭建文件服务器及实现文件服务的步骤

    使用Nginx搭建文件服务器及实现文件服务的步骤

    Nginx是轻巧、高效的Web服务器,用作文件服务器非常合适,但是需要一些高级功能,如FTP远程访问、多用户管理,可能需要选择更为复杂的方案,例如Apache或FileZilla Server,这篇文章主要介绍了详解如何使用Nginx搭建文件服务器及实现文件服务,需要的朋友可以参考下
    2024-01-01
  • Nginx配合php实现生成实时缩略图功能

    Nginx配合php实现生成实时缩略图功能

    这篇文章主要介绍了Nginx配合php实现生成实时缩略图功能,这在一些特殊场合可能会要用到,需要的朋友可以参考下
    2014-10-10
  • Nginx服务器抵御CC攻击的相关配置讲解

    Nginx服务器抵御CC攻击的相关配置讲解

    这篇文章主要介绍了Nginx服务器抵御CC攻击的相关配置讲解,CC攻击原理与DDoS基本相似而且技术含量低,注意防范即可,需要的朋友可以参考下
    2016-01-01
  • 深入理解Nginx之error_page模块的使用

    深入理解Nginx之error_page模块的使用

    error_page是nginx一个重要的指令,作用是定制化服务器错误页面,本文主要介绍了Nginx之error_page模块的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • nginx访问返回504问题及解决

    nginx访问返回504问题及解决

    这篇文章主要介绍了nginx访问返回504问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论