Https网站中请求Http内容

简介: Https网站中无法请求Http资源(静态资源、接口等)分析解决方法

Https网站中请求Http内容



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```


5.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>


6.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>



相关文章
|
5天前
|
安全 Java 网络安全
Servlet 教程 之 Servlet 客户端 HTTP 请求 2
Servlet教程介绍了如何在Servlet中处理HTTP请求,包括获取Cookie、头信息、参数、Session等。方法如:`getCookies()`、`getAttributeNames()`、`getHeaderNames()`、`getParameterNames()`等。还能获取身份验证类型、字符编码、MIME类型、请求方法、远程用户信息、URL路径、安全通道状态以及请求内容长度等。此外,可通过`getSession()`创建或获取Session,并以`Map`形式获取参数。
20 8
|
1天前
|
JSON 测试技术 API
Python的Api自动化测试使用HTTP客户端库发送请求
【4月更文挑战第18天】在Python中进行HTTP请求和API自动化测试有多个库可选:1) `requests`是最流行的选择,支持多种请求方法和内置JSON解析;2) `http.client`是标准库的一部分,适合需要低级别控制的用户;3) `urllib`提供URL操作,适用于复杂请求;4) `httpx`拥有类似`requests`的API,提供现代特性和异步支持。根据具体需求选择,如多数情况`requests`已足够。
7 3
|
1天前
|
安全 Go
解决https页面加载http资源报错
请注意,混合内容可能导致安全性问题,因此在使用上述方法时要小心。最好的方式是尽量减少或完全消除混合内容,以确保页面的安全性。
5 0
|
6天前
|
网络协议 网络安全 数据安全/隐私保护
http和https的区别!
http和https的区别!
|
8天前
|
安全 网络安全 开发工具
对象存储oss使用问题之flutter使用http库进行post请求文件上传返回400如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
31 1
|
9天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
9 0
|
12天前
|
缓存 安全 网络协议
【面试必备】HTTP和HTTPS是什么?有什么差异?
HTTP(超文本传输协议)和HTTPS(超文本传输安全协议)是用于在互联网上传输数据的协议。它们都是应用层协议,建立在TCP/IP协议栈之上,用于客户端(如浏览器)和服务器之间的通信。
20 2
|
1月前
|
前端开发
webpack如何设置devServer启动项目为https协议
webpack如何设置devServer启动项目为https协议
140 0
|
3月前
|
Web App开发 移动开发 JavaScript
Python网络编程(三),HTTP协议
Python网络编程(三),HTTP协议
61 0
|
4月前
|
网络协议
【计算机网络-应用层】HTTP协议
【计算机网络-应用层】HTTP协议