前端静态文件如何应对HTTPS的到来

近几年,越来越多的网站开始支持https,我们可以看到国外的比如github、谷歌、facebook;国内的有百度、淘宝、博客园、coding.net、worktile等一系列的网站。

我再最近的开发中,涉及到了一部分。我再页面中加入广告的代码,但是业务线的同事激动的告诉我他们要全站支持HTTPS,这对于我来说既兴奋又紧张,我当然对新技术充满好奇,但是我从来没有这方面的经验,为此我仔细的调查并找运维大神们问了一圈,我简单整理了一下,说一下有关于前端这边HTTPS的应对方案。

那么什么是HTTPS、它带来了什么?

  从名字来看,它比http多了一个“s”,这个“s”表示安全。目的在于提供更安全的HTTP通道,即HTTP下加入SSL层并且加密。太详细的我就不再这里说了,再说我就要抄百度百科了。简单来说,不同于HTTP使用80端口,HTTPS使用443端口,HTTPS还需要一个付费的CA证书来保证安全。从另一个角度讲安全也带来了开销和通信效率的降低,这就要看产品的一个取舍了。

HTTP给前端页面带来哪些挑战,不改行不行?

1、HTTPS下不能调用HTTP静态资源:

  浏览器默认是不允许在HTTPS里面引用HTTP资源的,一般都会弹出提示框,用户确认后才会继续加载,用户体验非常差。而且如果在一个HTTPS页面里动态的引入HTTP资源,比如引入一个js文件,会被直接block掉的。Chrome 21之后,在SSL加密页面embed非SSL的Flash会怎样呢?会被默默的屏蔽掉,只留下一句console报告。浏览器为了安全,https下跨协议调用http的是不行的,控制台里会有警告。所以你只能去找https协议的 css、js资源了。也有文章说https页面中可引用http的图片,我试了一下,发现虽然不会报红错,但是会有黄色的提醒。最好的方法是使用https的资源。

2、HTTPS下不能调用HTTP的异步请求:

  如果在https的页面中使用http的ajax调用。会提示跨域的报错,很明显有违ip地址、端口、协议的跨域限制。有两种方案:其一试调用https的ajax,既然页面都升级到https了那么服务接口升级也是应该的。其二既然跨域了,我们可以考虑jsonp的方案,但是jsonp 发出的是js文件请求(再次强调jsonp和ajax是两回事)。所以同上一个问题https中应用静态资源也必须是https的。所以即使是jsonp的方式也要提供jsonp接口的服务器支持https。看来异步请求也要升级到https才行。

3、不改行不行:

  通过上面两个问题,不改肯定是不行的。页面的静态用不了,请求也报错,这肯定是不行的。

前端应该如何应对?

1、静态文件拉取:

  首先要保证在https的页面中拉取http的静态资源。那么静态资源就必须支持https。这方面就要去抱运维大神们的大腿了,申请证书,配置到需要使用的服务器上(我们应该事先提供会用到哪些静态资源的域名)。确保可以获取https的静态资源后。我们可以考虑下一步。

2、服务升级:

  同样的拿到证书后,要保证ajax的jsonp的接口支持https。这样服务端的工作就支持的差不多了。

3、页面引用:

  既然我们的静态文件支持了http和https两种协议。但是静态文件并不知道页面是什么协议。我们应该怎么适应呢?引用资源的url中我们应该使用相对协议,比如

src=“http://a.com/static/a.js”

应该改为如下:去掉http:

src=“//a.com/static/a.js”

以“//”开头表示相对协议,页面使用的是什么协议,文件请求也自动是什么协议。同样的异步请求也应该这样适应。

4、对于老数据应该如何应对:

  好多的url中直接就带有http:// 那是过去留下来的历史问题。这些url存在数据库中,通过同步、异步的接口来到页面上,由于https的问题我们不能直接使用,我们就要通过js改造这些http:。简单来说,就是一个正则替换

(“http://abc.com/index.html”).replace(/http:/g, "")

  但是对于异步返回的json中,我们不能遍历每一个属性去替换,因为我们事先不了解json的结构,嵌套层级数,一个一个遍历也太低效了。我这里提供一个比较方便的方法,就是现将json序列化成字符串,再全局替换后反序列化。

1 var relativeHttp = function(obj){
2         var strObj = JSON.stringify(obj);
3         var removeHttp = strObj.replace(/http:/g, "");
4         return JSON.parse(removeHttp);
5     }

5、相对协议,永远都好用吗?

  相对协议在放进标签、js异步请求是都好用。但是当url的参数中需要加入url时,就不是很好用了。我们的“//”并没有成功,我们需要根据页面的情况加入协议,拼装成完整的url,我们怎么获取协议呢?其实浏览器为我们提供了这种API  window.location.protocol  如下图:

  我们拿到协议后可以根据需要来使用它。

  

时间: 2024-11-05 12:24:02

前端静态文件如何应对HTTPS的到来的相关文章

如何用Tomcat部署前端静态文件

在项目开发的过程中,一些公司经常是前后台分开的,并不是所有的前端文件都在后台项目中,尤其是互联网公司.这时候就需要后端人员单独运行前端文件.怎么用Tomcat部署运行前端静态文件呢? 工具/原料 Tomcat 方法/步骤 可以把文件直接放到webapps下面.当只是运行一个项目的时候,这种方法还好,但是当你涉及到两个以上项目的时候,就麻烦了.设定虚拟目录的方法,下面详细介绍.   配置虚拟目录也有两种方法,直接介绍我现在用的这种,直接在servler.xml里修改,毕竟经过了实践可用的,首先找到

Web 前端性能优化 : 如何有效提升静态文件的加载速度

作者:刘轶斌,腾讯应用开发 工程师商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处.原文链接:http://wetest.qq.com/lab/view/345.html 一.如何优化 用户在访问网页时, 最直观的感受就是页面内容出来的速度,我们要做的优化工作, 也主要是为了这个目标.那么为了提高页面加载(或者渲染)速度呢?一般来说有三个方面: 1.代码逻辑:优秀的代码逻辑结构可以有效减少渲染页面使用的内存和速度(比如虚拟DOM),此方面不在本文讨论范围内. 2.SSR服务器渲染,也

使用gulp自动化打包合并前端静态资源(CSS、JS文件压缩、添加版本号)

现在正在做的项目更新迭代比较频繁,会经常对前端代码打包部署,手动整合代码文件很麻烦并且浪费时间,所以决定使用gulp来代替手工完成这项工作. 前端静态资源在发版更新时会面临客户端浏览器缓存的问题(可参考这篇文章),解决这个问题可以采用两类方法:覆盖方法(引用资源时加版本号,不修改资源文件名).非覆盖方法(修改资源文件名),本篇文章主要采用的是第一种加版本号的方式,主要用gulp给静态资源自动加版本号和压缩CSS.JS. 原理:通过对JS,CSS文件内容进行Hash运算,生成一个文件的唯一Hash

Web前端性能优化——如何有效提升静态文件的加载速度

一.如何优化 用户在访问网页时, 最直观的感受就是页面内容出来的速度,我们要做的优化工作, 也主要是为了这个目标.那么为了提高页面加载(或者渲染)速度呢?一般来说有三个方面: 1.代码逻辑:优秀的代码逻辑结构可以有效减少渲染页面使用的内存和速度(比如虚拟DOM),此方面不在本文讨论范围内. 2.SSR服务器渲染,也就是所谓的“直出”.将首屏所有内容在服务器端渲染成html静态代码后,直接输出给浏览器,可以有效加快用户访问站点时首屏的加载时间.不过此方面也不在本文讨论范围内. 3.提升静态文件的加

flask 指定前端文件路径以及静态文件路径

flask 默认的 前端路径再 templates下,静态文件再 static下 如果不移动或者修改 app默认路径,可以直接这样写: 1 app = Flask(__name__) 如果有修改,可以这样写: 1 app = Flask(__name__,template_folder='../xxxx',static_folder="../xxxx") 2 3 #template_folder='../xxxx' 指 前端文件的目录 4 #static_folder="..

laravel 中 与前端的一些事4 之合并压缩静态文件

合并压缩多个静态文件到一个文件里面,可以减少网站的http请求,稍微优化性能,提高网站的用户体验 使用elixir来实现: 敲命令 合并并压缩js和css文件

几种快速以伺服静态文件的方法

我们经常碰到需要把某个文件夹迅速当成一个静态文件服务器的场景(比如下载了一个前端框架.插件,包括了静态演示网站等),如何用最快的速度把它变成一个服务器呢? 此文讨论的是不编程的情况下,如果考虑编程,任何语言都能写一个服务器啊 Apache, Nginx, IIS等大杀器 传统服务器自不在话下,只是你得去配置处把这个文件夹添加进去,我们的目标是迅速打开命令行/终端,一个命令搞定,这肯定不是最好的方法 node houston https://github.com/alejandro/Houston

django中url,静态文件,POST请求的配置

平时使用的是pycharm,所以这篇文章主要也是使用pycharm默认创建的django项目为基础进行讲解.项目目录如下图: 1.URL的配置 当创建好项目后,运行项目就可以看到django默认的页面.那么怎么访问自己创建的页面呢? 因为django是类MVC的开发模式.这里面就涉及到配置URL的问题.创建一个自己的APP(也可以称为一个模块),包含的文件内容如下图: 然后需要在setting.py的文件INSTALLED_APPS中注册新创建的App: 新创建项目的默认url配置如下: fro

将静态文件和控制函数分离(3)

将静态文件和控制函数分离 1,将前端的HTML静态文件,放进templates文件夹 2,在settings.py文件配置静态文件的路径 3,在views.py里,返回需要的静态html文件名 因为这是以前写的流程,只有pdf文件,我用图片方式贴出来,有不理解的可以提问哈!项目的整个流程代码在github可以得到:https://github.com/1fengchen1/forum.git