解决跨域问题 has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present

说一下做项目时需要用到html2canvas做项目截图踩到的跨域坑。

项目需要拉取用户的头像,而linkedin和微信的头像存放于cdn中,这边涉及到的跨域问题。

坑1:

由于跨域, 画布被污染,不能调用 toBlob(), toDataURL() 或 getImageData() 方法,调用它们会抛出安全错误。

按网上说的做,

        配置 useCORS: true,

        Nginx添加请求头

                add_header Access-Control-Allow-Origin *;
                add_header Access-Control-Allow-Credentials: true;

成功解决了画布被污染的问题。然而这种解决方法只可以解决你自己服务器的问题,你总不能去微信或其他第三方服务器添加请求头吧。。。更大的坑来了

坑2:

被对方服务器拒绝图片请求。

Access to Image 'https://media.licdn.com/dms/image/C5603AQHCky1Ku581hg/profile-displayphoto-shrink_100_100/0?e=1573689600&v=beta&t=8TqbDk8iWCXXXXXXXXXXXXXXXXXXXXX' has been blocked from origin '127.0.0.1:8000'

尝试了各种方法,包括

        在img标签上添加crossorigin = "anonymous";

        前端页面设置<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />;

        Nginx设置 add_header Cache-Control no-store;

都没有成功。

最后还是由Nginx解决,分两部步

第一步:

       首先将服务器保存的第三方cdn链接

              ‘https://media.licdn.com/dms/image/C5603AQHCky1Ku581hg/profile-displayphoto-shrink_100_100/0?e=1573689600&v=beta&t=8TqbDk8iWCXXXXXXXXXXXXXXXXXXXXX

       保存为 :

              "本地域名/third_image/dms/image/C5603AQHCky1Ku581hg/profile-displayphoto-shrink_100_100/0?e=1573689600&v=beta&t=8TqbDk8iWCXXXXXXXXXXXXXXXXXXXXX"

       访问第三方的域名涉及到跨域,但是访问本地的其他资源文件夹是OK的。

第二部:

       然后在Nginx设置一下代理

       location ^~ /third_image/ {
              add_header 'Access-Control-Allow-Origin' "$http_origin" always;
              add_header 'Access-Control-Allow-Credentials' 'true' always;
              add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;
              add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-  Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
              proxy_pass https://media.licdn.com/;
       }

也就是:

把            https://media.licdn.com/dms/image/C5603AQHCky1Ku581hg/profile-displayphoto-shrink_100_100/0?e=1573689600&v=beta&t=8TqbDk8iWCXXXXXXXXXXXXXXXXXXXXX
保存为     https://本地域名/third_image/dms/image/C5603AQHCky1Ku581hg/profile-displayphoto-shrink_100_100/0?e=1573689600&v=beta&t=8TqbDk8iWCXXXXXXXXXXXXXXXXXXXXX

最后由Nginx代理为  https://media.licdn.com/dms/image/C5603AQHCky1Ku581hg/profile-displayphoto-shrink_100_100/0?e=1573689600&v=beta&t=8TqbDk8iWCXXXXXXXXXXXXXXXXXXXXX
 

完美解决!眼泪都要掉下来了,太感人了

更新啦更新啦~~~~ 推荐大家阅读我的最新原理解析篇呀:解决跨域问题 has been blocked by CORS policy 后续,原理解析篇

       

这个错误信息说明在发送请求时,服务器返回的响应头中没有包含Access-Control-Allow-Origin字段,导致浏览器拒绝接受该响应。这是由于跨域访问(Cross-Origin Resource Sharing,CORS)的限制所引起的。 为了解决这个问题,可以添加一个名为CorsConfig的配置类,其中配置了允许跨域访问的规则。具体做法是使用addCorsMappings方法将允许跨域访问的规则添加到CorsRegistry中,可以设置allowedOriginPatterns为"*",表示允许来自所有域的请求;allowedHeaders设置为CorsConfiguration.ALL,表示允许所有请求头;allowedMethods设置为CorsConfiguration.ALL,表示允许所有请求方法;allowCredentials设置为true,表示允许发送身份验证信息;maxAge设置为3600,表示设置响应缓存的最大时间。通过这个配置类,服务器会在响应头中添加Access-Control-Allow-Origin字段,从而允许跨域访问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [has been blocked by CORS policy: No ‘Access-Control-Allow-Originheader is present on the ...](https://blog.csdn.net/qq_45800640/article/details/118422632)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [corsyusha:简单快速的代理,可在针对现有API进行原型设计时绕过CORS问题,而不必担心CORS](https://download.csdn.net/download/weixin_42176612/18261495)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [解决前后端跨域报错:has been blocked by CORS policy: No ‘Access-Control-Allow-Origin](https://blog.csdn.net/wsaicyj/article/details/127814374)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值