• 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


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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 质量保障的核心目标质量保障的核心目标在实际的项目或团队中很少有明确的约定或口径,就实际经验而言,可以归于一条:线上故障的减少。这个经验得来的目标实际是一个非常宽泛的目标了,通过团队成员的多方努力,这个目标仍然是“若即若离”。站在不同人员的角度,对测试目标会有共同的期望:故障的减少 & 人效的提升 & 迭代周期的缩短。但对测试结果的期望,线上故障的减少可以说是最核心的一个目标。产品故障的广泛定义从广义上来说,故障同时包括了:硬性质量引发的问题、软性质量引发的问题、需求定义引发的问题。硬性质量引发的问题指上线/配置修改等直接引发的线上不可用问题(用户直接不可用)软性质量的引发的问题...
            0 0 1110
            分享
          • 比较测试将产品与之前版本或其他类似产品的优缺点进行比较称为比较测试。等价划分它是一种测试技术,也是黑盒测试的一种。在此 等价分区期间,会选择一组组并选取一些值或数字进行测试。可以理解,来自该组的所有值都生成相同的输出。此测试的目的是删除特定组中产生相同输出但没有任何缺陷的冗余测试用例。假设应用程序接受 -10 和 +10 之间的值,然后使用等价分区,选择用于测试的值是零、一个正值和一个负值。因此,此测试的等效分区是 -10 到 -1、0 和 1 到 10。示例测试示例测试是实时测试。它包括实时场景和基于测试人员经验的场景。这种类型的测试也被称为基于经验的测试,因为它使用测试人员对应用...
            0 0 912
            分享
          • 移动应用特点与传统的PC软件系统相比,移动应用开发成本相对低廉,具有很好的便携性,极高的碎片时间利用率,很强的用户粘性及忠诚度,尤其随着网络及智能移动设备的迅速发展,移动应用占据了用户日常生活的大部分,人们常说的“手机控”“低头族”也充分说明了移动应用发展前景的火爆。移动应用具有以下几个特点。1、应用场景多变有了移动应用,人们参与互联网活动不再局限于办公室、家庭或其他固定场所,随处可见的“低头族”足以说明移动应用的应用场景广泛。2、高便携性以手游为例,传统的游戏有端游、页游,都需在PC上运行,随着掌上游戏机的发展,渐渐地将游戏移植到便携设备上,发展至今非常火爆的手游,如王者荣耀、大话西游、部落...
            0 0 1795
            分享
          •   数据独立性是指测试数据在测试执行各阶段的完整性和一致性,不会受到其他任务执行结果的影响。测试执行时,会存在当前被测系统手工案例与自动化案例使用同一测试环境的测试数据问题,在手工测试执行过程中,对测试数据的增删改可能会影响到自动化案例的执行,导致自动化案例执行不通过。本文介绍一些常见的测试数据准备方法,保证手工测试和自动化测试的数据独立性。  一、建立独立的测试环境或数据库  手工测试和自动化测试采用不同的测试环境或数据库,是数据独立性较为简单的解决办法。如可以单独建立自动化测试环境与手工测试环境,测试执行过程中,自动化测试使用独立的自动化测试环境,手工测试采用手工测试环境。避免了手工测试和...
            0 0 764
            分享
          • AI 智能客服几乎是每个业务网站的标配,在大型语言模型能力广泛被应用后,智能客服的实现变得更加轻易,可定制化的程度也更高。本篇内容,将指导你如何在几分钟时间内,使用 Dify 平台快速定制你网站的 AI 智能客服。即使非技术人员也能搞定!点击查看操作视频首先,你需要理解 Dify.AI 是什么?Dify 是一个开源且非常简单易用的 LLMOps 平台,让你能够可视化快速创建并运营 AI 应用的工具平台。 Dify 提供了可视化的 Prompt 编排、运营、数据集管理等功能。你甚至无需具备 AI 相关的技术研究和晦涩概念的理解。Dify 对接了各个出色的大型语言模型供应商,如 OpenAI、Az...
            0 0 1399
            分享
      • 51testing软件测试圈微信