原有http 页面升级https改造

很多老的cms和web系统在设计之初还未考虑https的兼容问题,现在随着web安全和用户隐私的不断升级,原来运行良好的网站也开始变得无法正常访问,如果你想继续让现代浏览器访问,就需要做https协议的适配,尤其是你使用一个域名开发新的业务配置过ssl协议以后,浏览器会自作主张的帮你升级到https模式,导致你的网页出现外部样式链接无法打开的情况,浏览器无法通过ssl证书确认你的身份,为了安全就直接让你无法发起同域的不同协议的请求。

所以需要进行对旧有业务页面的改造,又分为很多情况,有HTML页面,有动态程序,有无法修改的程序等。以下是我的一些改造实践。目标是让原来的http协议的网页支持https访问。

原有http 页面升级https改造

1、原http和https混合部署时注意事项。

资源引用的中https 和http 协议不同也存在安全隐患无法访问。

https协议访问后无法正常加载http请求。
http页面可以正常加载https标签请求-无法通过ajax 方式进行请求,需要特别注意。建议 ajax 请求按照 不写https: 和http: 使用 //www.域名的开头

2、通用实践:

2.1、图片加载

<img src="//www.你的域名.cn/im.jpg">

通过编辑器批量替换(与script标签相同):

src="https://
替换为:
src="//

2.2、css样式加载

<link href="//www.5656t.com/custom/radio/style.css?v=7" type="text/css" rel="stylesheet"/>

通过编辑器批量替换:

<link href="https://
替换为:
<link href="https://

href="https://file.5656t.com/ 替换为: href="https://file.5656t.com/

http://file.5656t.com/ 替换为: https://file.5656t.com/

http://g3.5656t.com/ 替换为: https://g3.5656t.com/

2.3、javascript加载方式

<script src="//file.5656t.com/custom/new/public/js/jquery.min.js"></script>
<script>
    $.getScript('https://file.5656t.com/custom/v/js/jquery.qrcode.min.js', function() {
        //alert(1);
    });
</script>

通过编辑器批量替换(与img标签相同):

src="https://
替换为:
src="//

js和css中的代码的懒加载带http 协议的话,需特别处理协议头,需要根据当前页面的请求协议进行适配,建议均配置成无协议头的 //www.你的域名形式。

此方法在通过本地file://协议头访问调试静态页面时会无法加载,需要考虑同本地运行虚拟机,通过虚拟网址进行访问调试。

目前video 和audio 标签引用的不影响。

2.4、通过js对网页中的元素进行替换:

<script>
    //判断协议是否包含https
    if(window.location.protocol === "https:"){
        //https: 协议下在这里执行需要的javascript代码
    }else{
        //http: 协议下在这里执行需要的javascript代码
    }
</script>

2.5、通过在页面插入js文件将页面对应的资源(img、css、js)在html中更换为https 的访问请求。

<script>
    if (window.location.hostname === 'www.你的前台域名.com') {
        // 如果域名是你的前台域名, 则执行这里的代码
        // 通过正则表达式匹配所有以 "http://" 或 "https://" 开头的链接,并将它们替换为 "https://"
        var links = document.getElementsByTagName('link');
        for (var i = 0; i < links.length; i++) {
            if (links[i].getAttribute('href').match(/^http:\/\//)) {
                links[i].setAttribute('href', links[i].getAttribute('href').replace(/^http:\/\//, 'https://'));
            }
        }

        // 对于 img 标签,也需要进行类似的操作
        var imgs = document.getElementsByTagName('img');
        for (var i = 0; i < imgs.length; i++) {
            var src = imgs[i].getAttribute('src');
            if (src && src.match(/^http:\/\//)) {
                imgs[i].setAttribute('src', src.replace(/^http:\/\//, 'https://'));
            }
        }

        // 获取页面中所有的script标签
        var scripts = document.getElementsByTagName('script');

        // 遍历script标签数组
        for (var i = 0; i < scripts.length; i++) {
            var script = scripts[i];
            
            // 检查script标签的src属性是否包含http协议
            if (script.src.startsWith('http://')) {
                // 替换src属性中的http协议为https协议
                script.src = script.src.replace('http://', 'https://');
                var script_l = document.createElement('script');
                script_l.src = script.src;
                document.head.appendChild(script_l);
            }
        }
        console.log('This code will run on ');
    } else {
        // 对于其他域名,执行这里的代码
        //console.log('This code will run on other domains');
    }
</script>

3、测试示例网页:

内部网站暂不展示