問題描述:
瀏覽器默認是不允許在HTTPS里面引用HTTP頁面的,ie下面會彈出提示框提示是否顯示不安全的內容,一般都會彈出提示框,用戶確認后才會繼續加載,但是chrome下面直接被block掉,只在控制台打出信息。
在寫網站的時候,自己的網站要嵌入別的網站,用iframe嵌入部分內容,當我把網站升級成https后,發現用iframe嵌http頁面內容顯示不出來,chrome控制台打出不安全的信息。
解決思路:
谷歌上不去不知道有沒有更好的解決辦法,反正百度里沒找到。大致說下思路,https里嵌不了http頁面,那就嵌https頁面好了,但是別人網站是http的,很多時候你是沒辦法要求別人的網站要做成https來配合你的,那么,我干脆起一台Apache服務器,配成https的,指定一個子域名,然后利用Apache的代理,將https代理到http的url。(當然,前提條件是你的服務器不是Apache,如果是Apache就簡單了)。這里注意,我們另外起的Apache跟我們原來的服務器沒有任何關系,Apache只用來處理http這種情況。(之前我有個誤區,是在自己的服務器前面套個Apache,也可以實現,但或許會有漏洞,還是並行處理更為科學);
具體做法:
這里假設我們自己的網站url是https://example.com/a.html,我們要嵌入的url是http://www.123.com/details.html。
先下載Apache,因為要配https,要帶ssl模塊,網上找帶ssl的msi安裝包找一半天沒找到(哪哥們美女找到請跟我說一下),這里提供一個下載教程http://jingyan.baidu.com/article/29697b912f6539ab20de3cf8.html,寫得還挺詳細的。這里我直接貼我的下載地址,http://www.apachehaus.com/cgi-bin/download.plx?dli=UVVMPFWaNFjTEp0KaJTNZBlVOpkVFVFdNdkUrR1d 64位的,我在server2008上測試的。下載完是一個包,httpd-2.2.29-x64-r3.zip,解壓Apache22文件夾,這是整個程序文件夾,放在你自己想放得地方,這個是自己帶了ssl的,不需要單獨加模塊,然后我們開始配置。
1,先裝Apache服務,dos命令bin目錄下,如果出現拒絕訪問的情況,windows附件里命令提示符右鍵管理員身份運行,win7下或許會出現這樣的問題。httpd.exe –k install,安裝成功會提示成功。然后httpd.exe 開啟服務,開不了找原因,試試在服務里去開,win+R services.msc這里要注意,這個版本的Apache默認加載ssl模塊,默認端口是443,如果端口被占用了,要改端口。查看端口是否被占用,這里提供幾個dos命令:a.查看所有的端口占用情況netstat -ano;b.查看指定端口的占用情況netstat -aon|findstr "443"找到PID比如2016;c.找到對應的程序tasklist|findstr "2016"。改Apache https端口:config/extra/httpd-ssl.conf,要改的地方很簡單,找到443,這里我改成445,我們主網站用的443,改成你的端口,改完配置別忘了重啟。
2,配https,這里應該是最麻煩的事了,配好后,訪問https://127.0.0.1:445會出現風險什么的,查看https那里的叉,這是Apache默認測試的證書
(截圖太多貌似發布不了,點開證書信息應該是說頒發給Apache Haus什么的),好這里開始配證書,conf/httpd.conf,打開,最下面, ,
就是這個地方,狠坑了我一把,也是參照網上配的,但是不管怎么配證書就是不對,后來猜想這里可能有問題,果然貓膩在這里。這里改成httpd-ssl.conf 這個配置,我是在這個里面配的。現在到conf/extra下面,你可以看到httpd-ssl.conf,核心的配置在這里
(是不是要監聽443端口,改成445),
(同上),
證書和私鑰,這里改成你自己的就可以了,記住要放在ssl文件夾里。
3,重啟Apache,開啟服務就應該有這個,右下角,沒有在bin目錄下打開ApacheMonitor.exe
4,好了,前幾步沒問題,現在訪問https://example.com:445/應該就是Apache默認的頁面,現在我們利用Apache的反向代理做url映射,httpd.conf里找到這兩行,把前面的#號去掉,然后在最底下加兩行
ProxyPass /proxy/ http://www.123.com/details.html
ProxyPassReverse /proxy / http://www.123.com/details.html
然后重啟Apache,上面兩句話的意思是你訪問https://example.com:445/proxy/將代理到http://www.123.com/details.html,所以當你要在地址上帶后綴的時候,就體現出了價值,比如產品有產品號什么的,https://example.com:445/proxy/?id=340實際上訪問的是http://www.123.com/details.html?id=340,這樣就能得到不同的產品詳情。
5,沒什么問題這樣就解決了https嵌http不安全的問題。這里講講跨域的問題,
URL | 說明 | 允許通信 |
http://www.a.com/a.js |
同一域名下 | 允許 |
http://www.a.com/lab/a.js |
同一域名下不同文件夾 | 允許 |
http://www.a.com:8000/a.js |
同一域名,不同端口 | 不允許 |
http://www.a.com/a.js |
同一域名,不同協議 | 不允許 |
http://www.a.com/a.js |
域名和域名對應ip | 不允許 |
http://www.a.com/a.js |
主域相同,子域不同 | 不允許 |
http://www.a.com/a.js |
同一域名,不同二級域名(同上) | 不允許 |
http://www.a.com/a.js |
不同域名 | 不允許 |
實際上,我們這里端口並不一樣,還是屬於跨域,但是問題的初衷是https里面不能嵌套http,所以,如果https里面嵌套的https頁面跨域了,也是沒有問題的。
總結:
這坑爹的問題,之前完全沒發現,等到上線的時候發現不行了,我去,當時真是無語死了,也沒有解決辦法,現在寫出來吧,如果有人遇到同樣的問題了,希望能幫你解決這個問題,知識要共享。這個不涉及代碼的問題,整個就是配置配置,另外給大家貼個講Apache的網站,Apache真心不錯,好使http://www.php100.com/manual/apache2/mod/mod_proxy.html