很多老的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、测试示例网页:
内部网站暂不展示