把頁面中的img,script,link等標(biāo)簽為空鏈可以導(dǎo)致頁面多余請求的問題,包括IE,F(xiàn)irefox,chrome,Safari!但是相對于img,script跟link的src、href為空時(shí),在IE下不做請求,而Chrome, Safari, 和 Firefox則會(huì)出現(xiàn)一次多余的新請求。下面詳細(xì)講解一下:
img src為空的情況分析
無論是在html中寫入<img src='' />還是在js中通過Image對象建立var img = new Image(); img.src = "";,都會(huì)導(dǎo)致向你的服務(wù)器多做一次請求。而具體請求的情況分析如下:
在IE中,這樣做會(huì)請求一次當(dāng)前頁面所在的目錄。如在http://js8.in/demo/a.html 中出現(xiàn)這種空src的標(biāo)簽,會(huì)導(dǎo)致重新請求一次:http://js8.in/demo/
在Safari 和 Chrome中,將請求當(dāng)前頁面本身。
在Firefox 3.5以前的版本中,有和Safari同樣的問題,但是在3.5中修正了這個(gè)BUG。
在Opera 中,不會(huì)做額外的請求。
在一個(gè)訪問量不高的網(wǎng)站中,多一個(gè)這樣的請求也無所謂(甚至可以讓你的網(wǎng)站瀏覽看上去翻番),但在一個(gè)千萬級訪問量甚至更高的WEB站點(diǎn)里,這樣會(huì)導(dǎo)致你的服務(wù)器和帶寬的成本顯著增加。 另外一個(gè)隱患是,重新請求某個(gè)頁面可能會(huì)導(dǎo)致用戶的一些信息被無意中修改,例如cookies,或者ajax操作。
你永遠(yuǎn)不會(huì)寫出這樣的代碼?
我并不這么認(rèn)為,很多時(shí)候這種情況在無意中出現(xiàn),比如下面這段php代碼:
<img src="$imageUrl" alt="" />
你原計(jì)劃是從服務(wù)器端讀取這個(gè)src地址,但是由于某個(gè)原因,這個(gè)地址還未設(shè)置,或者代碼的BUG導(dǎo)致讀取失敗,就會(huì)出現(xiàn)空的src標(biāo)簽。
其他的標(biāo)簽中的空src會(huì)不會(huì)導(dǎo)致這樣的問題?
好消息是,在IE中只有image標(biāo)簽有這個(gè)問題。
壞消息是,在Chrome, Safari, 和 Firefox中<script src=""> 和<link href="">都會(huì)導(dǎo)致出現(xiàn)一個(gè)新的請求。
如何解決這個(gè)問題?
可以從兩方面著手,一是盡量避免這種壞的編程方式,不要出現(xiàn)空的src標(biāo)簽。另外,可以從服務(wù)器端著手,在發(fā)現(xiàn)時(shí)這種無意義的請求時(shí)不要返回任何東西給客戶端。
<?php
$referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
$url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
if ($referrer == $url){
exit;
}
?>
原文鏈接:http://www.js8.in/555.html