很多人做的網站、博客會被別人用嵌套成為別人的網站,而瀏覽器可能還會收錄這些盜用者的頁面,結果自己做的網站反而讓別人增加了排名,這是無法接受的。
那麼如何防止網頁被別人的iframe嵌套,防止別人低成本地鏡像自己的網站呢?最簡單的方法,是使用js在做個前端處理:
原理就是判斷 window.top 是不是 window.self,如果不是則說明被嵌套了,強制把自己的location替換到top去,實現反嵌套。核心語句是這個
if(window.top != window.self)window.top.location = window.self.location;
但由於方法簡單,所以也很容易被人破解。如果別人在引用iframe的時候,是通過document.write('<iframe>'),那麼上面的js代碼就無法生效,比如:
document.write('<iframe>');
所以網上很多文章會建議使用Meta標籤加 X-FRAME-OPTIONS 屬性,通過瀏覽器來判斷和拒絕被嵌套頁面的顯示:
這個仍然是在前端頁面裡做的,由於其不可靠, X-FRAME-OPTIONS 特性已經逐漸被瀏覽器棄用了,因此現在也不好使了,但它被保留在了服務器端,通過添加響應頭的方法實現避免網頁被嵌套,大多數瀏覽器能支持。
X-Frame-Options 有三個值:
DENY
表示該頁面不允許在 frame 中展示,即便是在相同域名的頁面中嵌套也不允許。
SAMEORIGIN
表示該頁面可以在相同域名頁面的 frame 中展示。
ALLOW-FROM uri
表示該頁面可以在指定來源的 frame 中展示。
方法1:在服務器端,可通過修改web服務的配置來實現,適合所有的靜態頁面或者動態頁面:
配置 Apache的方法:
例1:在所有頁面上發送 X-Frame-Options 響應頭
Header always append X-Frame-Options SAMEORIGIN
例2:配置 X-Frame-Options 設置成拒絕
Header set X-Frame-Options "deny"
例3:配置 X-Frame-Options 設置成 allow-from
Header set X-Frame-Options "allow-from https://example.com/"
配置 nginx的方法:
add_header X-Frame-Options SAMEORIGIN always;
方法2:在服務器端,也可以通過設置後端語言的http響應頭來實現:
php
header('X-Frame-Options:Deny');
asp
Response.AddHeader("X-Frame-Options", "Deny");
方法1或2任選其一即可,至此,終於完美解決!
閱讀更多 代碼四驅 的文章