考拉昇級https經驗

網易考拉前端團隊發表於2019-02-21

一、為什麼要升級https

  1. 保護使用者資料傳輸過程中的安全。
  2. 運營商網路劫持問題越來越嚴重,各種廣告插入、強制跳App下載等手段嚴重影響使用者體驗,如果有違法內容或者使用者被騙,還會牽連到考拉。
  3. Apple要求iOS平臺App在2017.1.1開始強制啟用https,否則不允許上架App Store;啟用https的應用如果要在各平臺都正常,需應用內部webview開啟的站點也全部啟用https。
  4. 隨著web標準的更新,越來越多的新特性(比如Service Worker等)要求站點開啟HTTPS才能使用;

二、目標

  • 調整考拉前端程式碼,使其可同時支援https,http訪問;
  • 與日常開發同步進行,不影響日常開發;
  • 穩步啟用https,http雙協議支援,最大限度避免https上線導致的問題;

三、前端做了哪些調整

升級範圍為考拉前臺所有站點,包括wap、web等工程,歷史程式碼量大;主要是將原寫死http協議的地方改造成相對協議,使其可同時相容http及https服務;

1. 頁面內資源協議修改

頁面資源包括幾部分: 靜態資源(js,css,ui圖片,視訊等等),動態內容修改

  • 靜態資源
    • js: 調整js內部的http資源引用為相對協議,但是傳遞給外部應用的資料則根據 location.protocol 自動補全為當前頁面使用的協議; 其次調整頁面對js的引用,使js資源引用為相對協議;
    • css:調整mcss中圖片等資源引用URL為相對協議;調整頁面對css的引用為相對協議;
    • 打包調整: 調整打包工具配置,使其輸出靜態資源為相對協議;
    • 圖片: 調整js、ftl中的圖片縮略函式,區別是否為考拉和nos的圖片,判斷是否支援https做相應縮略處理,防止外部圖片不支援https而顯示不出來;全工程查詢並替換硬編碼圖片標籤src屬性;
    • 外部庫調整: 比如NEJ的一些模組或者工具,在URL改為相對協議是,認為其不是一個絕對地址,按相對協議解析會報錯,會導致資源載入問題; 比如檔案上傳功能,在fallback到flash方案時,flash資訊都是寫死為http,也做了調整;
  • 動態內容
    後端給資料,前端顯示型別的內容:
    • 圖文詳情:用正則匹配圖文詳情裡面的img,video標籤,並替換http協議為相對協;
    • 頁面內部插值輸出:調整js、ftl縮圖過濾器,為未使用過濾器的圖片等資源增加過濾器,自動進行相對協議處理;
  • 頁面跳轉
    由於部分運營配置的頁面,都是直接配置了http連結,使用者點選頁面的連結很容易跳回到http,不能長期在https下使用,於是我們在頁面的a標籤點選時自動根據當前頁面協議,調整a標籤的href屬性的協議為當前協議,來支援正常跳轉。

2. CSP規則調整

原CSP規則限制了頁面內部載入的資源,協議必須一直,但是https上線初期緩和內容難以避免,所以在CSP中增加了規則,允許瀏覽器載入混合內容(僅限圖片、視訊);

3. 外部關聯調整

  • 微信支付: 調整微信支付後臺登記的安全域名資訊,增加https url,使其同時支援雙協議; 但是此調整不能在業務高峰期做,否則可能影響線上支付;

四、升級過程

這裡僅僅列出主要的步驟,細節還比較多:

  1. 前端修改雙協議支援後的程式碼上線,並讓cdn支援https
  2. 公司內網雙協議開啟進行內部小範圍試用
  3. 線上雙協議開啟,但是不開啟https強制跳轉
  4. 線上功能級別灰度啟用https,讓使用者可以從一些頁面開始使用https
  5. 全部放開

五、後續其它可以做的

  1. 上線h2, 已經在做了,很快開始內部測試
  2. 域名收斂
  3. 其它優化等

by 漁樵

相關文章