很多人做的網(wǎng)站、博客會(huì)被別人用嵌套成為別人的網(wǎng)站,而瀏覽器可能還會(huì)收錄這些盜用者的頁(yè)面,結(jié)果自己做的網(wǎng)站反而讓別人增加了排名,這是無(wú)法接受的。
那么如何防止網(wǎng)頁(yè)被別人的iframe嵌套,防止別人低成本地鏡像自己的網(wǎng)站呢?最簡(jiǎn)單的方法,是使用js在做個(gè)前端處理:
<script type="text/JAVAscript"> window.onload=function(){ if(window.top != window.self)window.top.location = window.self.location; } </script>
原理就是判斷 window.top 是不是 window.self,如果不是則說(shuō)明被嵌套了,強(qiáng)制把自己的location替換到top去,實(shí)現(xiàn)反嵌套。核心語(yǔ)句是這個(gè)
if(window.top != window.self)window.top.location = window.self.location;
但由于方法簡(jiǎn)單,所以也很容易被人破解。如果別人在引用iframe的時(shí)候,是通過(guò)document.write('<iframe></iframe>'),那么上面的js代碼就無(wú)法生效,比如:
document.write('<iframe frameborder="0" scrolling="yes" name="main" src="http://你的網(wǎng)址" style="height:100%; visibility: inherit; width: 100%; z-index: 1;overflow: visible;"></iframe>');
所以網(wǎng)上很多文章會(huì)建議使用Meta標(biāo)簽加 X-FRAME-OPTIONS 屬性,通過(guò)瀏覽器來(lái)判斷和拒絕被嵌套頁(yè)面的顯示:
<meta http-equiv =“X-Frame-Options”contents =“DENY”>
這個(gè)仍然是在前端頁(yè)面里做的,由于其不可靠, X-FRAME-OPTIONS 特性已經(jīng)逐漸被瀏覽器棄用了,因此現(xiàn)在也不好使了,但它被保留在了服務(wù)器端,通過(guò)添加響應(yīng)頭的方法實(shí)現(xiàn)避免網(wǎng)頁(yè)被嵌套,大多數(shù)瀏覽器能支持。
X-Frame-Options 有三個(gè)值:
DENY
表示該頁(yè)面不允許在 frame 中展示,即便是在相同域名的頁(yè)面中嵌套也不允許。
SAMEORIGIN
表示該頁(yè)面可以在相同域名頁(yè)面的 frame 中展示。
ALLOW-FROM uri
表示該頁(yè)面可以在指定來(lái)源的 frame 中展示。
方法1:在服務(wù)器端,可通過(guò)修改web服務(wù)的配置來(lái)實(shí)現(xiàn),適合所有的靜態(tài)頁(yè)面或者動(dòng)態(tài)頁(yè)面:
配置 Apache的方法:
例1:在所有頁(yè)面上發(fā)送 X-Frame-Options 響應(yīng)頭
Header always Append X-Frame-Options SAMEORIGIN
例2:配置 X-Frame-Options 設(shè)置成拒絕
Header set X-Frame-Options "deny"
例3:配置 X-Frame-Options 設(shè)置成 allow-from
Header set X-Frame-Options "allow-from https://example.com/"
配置 Nginx的方法:
add_header X-Frame-Options SAMEORIGIN always;
方法2:在服務(wù)器端,也可以通過(guò)設(shè)置后端語(yǔ)言的http響應(yīng)頭來(lái)實(shí)現(xiàn):
php
header('X-Frame-Options:Deny');
asp
Response.AddHeader("X-Frame-Options", "Deny");
方法1或2任選其一即可,至此,終于完美解決!