• 0
  • 0
分享

Https网站中无法请求Http资源(静态资源、接口等)

今天遇到个问题:

```Mixed Content: The page at ‘https://*****’ was loaded over HTTPS, 
but requested an insecure XMLHttpRequest endpoint ‘http://*****’. 
This request has been blocked; the content must be served over HTTPS```

1.png

突然意识到出问题的网站服务器配置了https,请求的一个接口部署的服务器为http环境。

分析

如果一个https网站中的某个页面内容如下,这个页面部署在配置了https的服务器中,但是页面加载时请求了有js、css、图片和接口四个http协议的资源:

```http://cdn.staticfile.org/animate.css/4.1.0/animate.compat.css```、
```http://cdn.staticfile.org/react/16.13.1/cjs/react.development.js```、
```http://ww4.sinaimg.cn/bmiddle/6910ab7bgw1egloghsfi3j20b40b40t6.jpg```、
```http://getjson.cn/api/get/nkK3HHTUieWI25fA```
<html>
<head>
    <meta charset="UTF-8">
    <title>https-http</title>
    <link href="http://cdn.staticfile.org/animate.css/4.1.0/animate.compat.css" type="text/css" >
    <script src="http://cdn.staticfile.org/react/16.13.1/cjs/react.development.js"></script>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<img src="http://ww4.sinaimg.cn/bmiddle/6910ab7bgw1egloghsfi3j20b40b40t6.jpg"/>
<script type="text/javascript">
    const url = "http://getjson.cn/api/get/nkK3HHTUieWI25fA";
    $(document).ready(function () {
        $(document.body).attr('style', 'cursor:pointer;');
        $.ajax({
            url: url,
            async: true,
            success: function (result) {
                try {
                    var jsonResult = JSON.stringify(result);
                    console.log(jsonResult);
                } catch (err) {
                    console.log(err);
                }
            }
        });
    });
</script>
</body>
</html>

2.png

访问后,控制台报错:

Mixed Content: The page at ‘https://*****’ was loaded over HTTPS, 
but requested an insecure ****. This request has been blocked; 
the content must be served over HTTPS。

加载的js和请求的接口被拒绝了,图片可以加载出来,但是也有警告?

https地址中,如果加载了http资源,浏览器将认为这是不安全的资源,将会默认阻止。

解决方法

以下情况假设不存在跨域问题

  1. 如果在https网站中请求的http资源本身就支持https,可以在html页面加入<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">,浏览器在解析请求的时候会自动把http请求转化为https请求。

  2. 如果如果在https网站中请求的http资源本身不支持https,可以把https网站换成http协议。(当我没说??)

  3. 如果如果在https网站中请求的http资源本身不支持https,但是请求的http资源在属于自己的服务上(非第三方服务),并且不考虑改为https协议带来的性能问题,可以把要请求的http资源协议改为https。

  4. 如果在https网站中请求的http资源本身不支持https,并且这些被请求的http资源都是静态资源(比如js、css等),可以考虑把这些资源下载下来放到现有的https服务器中,也可以寻找https协议的资源,很多免费的cdn服务都同时提供了https和http协议的静态资源。

  5. 如果在https网站中请求的http资源是动态资源(比如请求http接口),且是第三方接口(自己无法变更这个第三方接口是http协议的事实),可以用nginx代理的方式。

以上面分析的html为例,在https网站中请求了一个http协议的第三方接口,可以通过让配置了https的nginx代理那个http接口,然后让前端访问接口的时候先访问nginx,nginx再访问第三方http服务。

的搞一台配置了https的nginx(如果没有的话),添加proxy_pass配置:

server {
        location jsonapi/ {
            proxy_pass http://getjson.cn/api/;
        }
}

然后前端发起请求的地址,改成nginx代理的地址

<script type="text/javascript">
    const url = "nginx的地址/jsonapi/get/nkK3HHTUieWI25fA";
    $(document).ready(function () {
        $(document.body).attr('style', 'cursor:pointer;');
        $.ajax({
            url: url,
            async: true,
            success: function (result) {
                try {
                    var jsonResult = JSON.stringify(result);
                    console.log(jsonResult);
                } catch (err) {
                    console.log(err);
                }
            }
        });
    });
</script>

当然网页中静态的http资源也可以由nginx来代理:

server {
        location /httpresource {
            proxy_pass http://cdn.staticfile.org/;
        }
}

然后前端请求静态资源的地址,改成nginx代理的地址

<head>
    <meta charset="UTF-8">
    <title>https-http</title>
    <link href="nginx的地址/httpresource/animate.css/4.1.0/animate.compat.css" type="text/css" >
    <script src="nginx的地址/httpresource/react/16.13.1/cjs/react.development.js"></script>
</head>


作者:dannyhoo6688

原文链接:https://blog.csdn.net/huyuyang6688/article/details/106697889


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   前言  在学习自动化或者是去面试自动化相关岗位时,难免会遇到的一个问题是:如何处理自动化请求中的登录信息?不论是在学习接口自动化还是出去面试自动化测试岗位,测试人员遇到的一个问题都是如何处理登录?  举例一个很简单的例子:  在做接口自动化测试的时候,肯定会遇到一种测试场景在进行操作的时候会提示用户进行登录或者直接返回HTTP状态码401(未授权)。  例如:我们在进行电商平台购物时,要创建订单前都会提示我们先进行登录。 因为HTTP协议是无状态的,所以在创建订单时,服务器不知道哪个用户在操作。因此,用户在创建订单时必须要先进行登录,登录成功后服务器会返回一个特定的标识,该标识用于识别用户...
            15 15 1344
            分享
          •   现在的宜家,越来越像美食UP主了。  大家对宜家最早的印象,无外乎是小红书千篇一律的极简风东欧性冷淡式家具,和特别适合拍照的线下门店。但在最近几年里,市场上来自宜家的声音越来越弱。  今年7月,“IKEA宜家风味屋”的抖音账号正式上线,该账号的认证主体为(宜家)中国投资有限公司,发布的视频以肉丸、牛排、松饼、各类蛋糕美食为主。IKEA宜家风味屋后续还尝试了直播带货,销量最高的是宜家瑞典风味餐厅的经典肉丸单人套餐,售价36.99元,目前已经迈出了3094份。  作为在中国布局多年的家居品牌来说,尝试美食视频可谓是破天荒的第一次,但也能看出宜家的窘迫处境。作为国际家居巨头,也需要通过线上的美食...
            0 0 729
            分享
          •   在软件开发中,测试工作在保障软件质量与提升用户体验过程中占据重要角色。  例如,性能测试是软件质量保障的关键环节之一,它可以评估软件开发的可靠性、稳定性及响应时间等。然而,测试过程中往往需要投入大量的时间与资源,因此为了节约资源、提高开发效率选择一款合适的测试工具尤为重要。  最近,马建仓在 Gitee 上看到一款高效的性能测试工具——RunnerGo,不仅能减少开发人员的工作量,同时还能快速识别应用中的性能瓶颈问题。值得一提的是,该项目目前已经成为 Gitee 的 GVP 项目。  开源许可证: Apache-2.0  项目地址: https://gitee.com/Runner-Go-...
            0 0 466
            分享
          •  作为一个Web前端开发者,开发过程中除了写业务代码,剩余大多数时间都花在了API的联调上。为了解决这个问题,大多数开发者会选择Mock接口的方案,但是前端领域的几种常用 Mock 方案都需要一定的学习成本。那么有没更优雅便捷的方案可以提高开发者开发效率实现下班自由呢。一款对前端开发者优化的 API 管理工具假设我们现在要开发一个获取用户信息的功能,常规流程是这样的:1、接口设计。2、后端开发接口(此时前端开发页面)。3、后端接口开发测试完成,交付前端进行开发调试测试。 现在我们使用 Apifox 来参与开发会怎么样呢?1.接口设计在接口设计的环节,我们使用 Apifox 进行,通...
            12 11 1681
            分享
          •   3月21号,微软创始人比尔·盖茨,在盖茨笔记中,发表最新AI文章《人工智能时代已经开始——人工智能与智能手机、互联网一样具有革命性》,文章中表示:自1980年首次看到图形用户界面(graphical user interface)以来,OpenAI的GPT人工智能模型是他所见过的最具革命性的技术进步。比尔·盖茨认为人工智能(AI)可与智能手机、互联网比肩齐声。  这篇文章,值得关注的是,盖茨提出对人工智能如何可以减少世界上最严重的不公平现象的思考,以及我们关注的人工智能风险问题。  让我们看看大佬的完整文章内容吧!  在我的一生中,我见证了两次让我觉得是革命性的技术展示。  第一次是在19...
            0 0 1109
            分享
      • 51testing软件测试圈微信