問題
如果在 https 協議的頁面中加載了 http 資源,瀏覽器將認為這是不安全的,會默認阻止,會帶來資源不全的問題。
比如:圖片無法顯示,樣式無法加載,JS 無法加載。如果頁面關鍵資源均為 http 協議,所有的操作、請求都將無效。
報錯
Mixed Content: The page at 'https://xxxx.com' was loaded over https, but requested an insecure script 'http://xyz.com', this request has been blocked; the content must be served over https.
方案
1. 直接復制位於http協議服務器上的靜態資源到本地(多用於解決第三方的問題),重新創建一套https的資源,讓http和https指向各自的服務器;
2. 用同一套代碼,由nginx代理轉發http和https到相同的靜態資源,這要求兩個協議處於同一服務;
3. 加載靜態資源時,不直接指定協議,使用當前頁面協議,如<script src="//cdn.com/jquery.js"></script>,會自動根據當前頁面的協議進行資源加載;
4. 在頁面的head中加入meta標簽<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">,其作用是將當前頁面所有http協議地址升級為https進行請求,由於該方案僅替換協議部分,如果http和https不同協議下靜態資源路徑有變化,該方法無法使用;
5. iframe的地址是http協議的,如果他們拒絕升級,解決方案只有自己寫一遍iframe頁面到本地。