精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

淺談瀏覽器http的緩存機制

開發 前端
針對瀏覽器的http緩存的分析也算是老生常談了,每隔一段時間就會冒出一篇不錯的文章,其原理也是各大公司面試時幾乎必考的問題。

[[191147]]

針對瀏覽器的http緩存的分析也算是老生常談了,每隔一段時間就會冒出一篇不錯的文章,其原理也是各大公司面試時幾乎必考的問題。

之所以還寫一篇這樣的文章,是因為近期都在搞新技術,想“回歸”下基礎,也希望盡量總結的更詳盡些。

那么你是否還需要閱讀本篇文章呢?可以試著回答下面這個問題:

我們在訪問百度首頁的時候,會發現不管怎么刷新頁面,靜態資源基本都是返回 200(from cache): 

 

 

 

隨便點開一個靜態資源是醬的:

哎喲有Response報頭數據呢,看來服務器也正常返回了etag什么鬼的應有盡有,那狀態200不是應該對應的非緩存狀態么?要from cache的話不是應該返回304才合理么?

難道是度娘的服務器故障了嗎?

如果你知道答案,那就可以忽略本文了。

http報文中與緩存相關的首部字段

我們先來瞅一眼RFC2616規定的47種http報文首部字段中與緩存相關的字段,事先了解一下能讓咱在心里有個底:

1. 通用首部字段(就是請求報文和響應報文都能用上的字段)

2. 請求首部字段

3. 響應首部字段

4. 實體首部字段

后續大體也會依次介紹它們。

場景模擬

為方便模擬各種緩存效果,我們建個非常簡單的場景。

1. 頁面文件

我們建個非常簡單的html頁面,上面只有一個本地樣式文件和圖片:

  1. <!DOCTYPE html> 
  2.  
  3. <html> 
  4.  
  5. <head> 
  6.  
  7. <title>緩存測試</title> 
  8.  
  9. <link rel="stylesheet" href="css/reset.css"
  10.  
  11. </head> 
  12.  
  13. <body> 
  14.  
  15. <h1>哥只是一個標題</h1> 
  16.  
  17. <p><img src="img/dog.jpg" /></p> 
  18.  
  19. </body> 
  20.  
  21. </html>  

2. 首部字段修改

有時候一些瀏覽器會自行給請求首部加上一些字段(如chrome使用F5會強制加上“cache-control:max-age=0”),會覆蓋掉一些字段(比如pragma)的功能;另外有時候我們希望服務器能多/少返回一些響應字段。

這種情況我們就希望可以手動來修改請求或響應報文上的內容了。那么如何實現呢?這里我們使用Fiddler來完成任務。

在Fiddler中我們可以通過“bpu XXX”指令來攔截指定請求,然后手動修改請求內容再發給服務器、修改響應內容再發給客戶端。

以我們的example為例,頁面文件走nginx通過 http://localhost/ 可直接訪問,所以我們直接執行“bpu localhost”攔截所有地址中帶有該字樣的請求: 

 

 

 

點擊被攔截的請求,可以在右欄直接修改報文內容(上半區域是請求報文,下半區域是響應報文),點擊黃色的“Break on Response”按鈕可以執行下一步(把請求發給服務器),點擊綠色的按鈕“Run to Completion”可以直接完成整個請求過程: 

 

 

 

通過這個方法我們可以很輕松地模擬出各種http緩存場景。

3. 瀏覽器的強制策略

如上述,當下大多數瀏覽器在點擊刷新按鈕或按F5時會自行加上“Cache-Control:max-age=0”請求字段,所以我們先約定成俗——后文提及的“刷新”多指的是選中url地址欄并按回車鍵(這樣不會被強行加上Cache-Control)。

事實上有的瀏覽器還有一些更奇怪的行為,在后續我們回答文章開頭問題的時候會提到。

石器時代的緩存方式

在 http1.0 時代,給客戶端設定緩存方式可通過兩個字段——“Pragma”和“Expires”來規范。雖然這兩個字段早可拋棄,但為了做http協議的向下兼容,你還是可以看到很多網站依舊會帶上這兩個字段。

1. Pragma

當該字段值為“no-cache”的時候(事實上現在RFC中也僅標明該可選值),會知會客戶端不要對該資源讀緩存,即每次都得向服務器發一次請求才行。

Pragma屬于通用首部字段,在客戶端上使用時,常規要求我們往html上加上這段meta元標簽(而且可能還得做些hack放到body后面去):

  1. <meta http-equiv="Pragma" content="no-cache"

它告訴瀏覽器每次請求頁面時都不要讀緩存,都得往服務器發一次請求才行。

BUT!!! 事實上這種禁用緩存的形式用處很有限:

1. 僅有IE才能識別這段meta標簽含義,其它主流瀏覽器僅能識別“Cache-Control: no-store”的meta標簽(見出處)。

2. 在IE中識別到該meta標簽含義,并不一定會在請求字段加上Pragma,但的確會讓當前頁面每次都發新請求(僅限頁面,頁面上的資源則不受影響)。

做了測試后發現也的確如此,這種客戶端定義Pragma的形式基本沒起到多少作用。

不過如果是在響應報文上加上該字段就不一樣了:

如上圖紅框部分是再次刷新頁面時生成的請求,這說明禁用緩存生效,預計瀏覽器在收到服務器的Pragma字段后會對資源進行標記,禁用其緩存行為,進而后續每次刷新頁面均能重新發出請求而不走緩存。

2. Expires

有了Pragma來禁用緩存,自然也需要有個東西來啟用緩存和定義緩存時間,對http1.0而言,Expires就是做這件事的首部字段。

Expires的值對應一個GMT(格林尼治時間),比如“Mon, 22 Jul 2002 11:12:01 GMT”來告訴瀏覽器資源緩存過期時間,如果還沒過該時間點則不發請求。

在客戶端我們同樣可以使用meta標簽來知會IE(也僅有IE能識別)頁面(同樣也只對頁面有效,對頁面上的資源無效)緩存時間:

<meta http-equiv="expires" content="mon, 18 apr 2016 14:30:00 GMT">

如果希望在IE下頁面不走緩存,希望每次刷新頁面都能發新請求,那么可以把“content”里的值寫為“-1”或“0”。

注意的是該方式僅僅作為知會IE緩存時間的標記,你并不能在請求或響應報文中找到Expires字段。

如果是在服務端報頭返回Expires字段,則在任何瀏覽器中都能正確設置資源緩存的時間: 

 

 

 

在上圖里,緩存時間設置為一個已過期的時間點(見紅框),則刷新頁面將重新發送請求(見藍框)。

那么如果Pragma和Expires一起上陣的話,聽誰的?我們試一試就知道了:

我們通過Pragma禁用緩存,又給Expires定義一個還未到期的時間(紅框),刷新頁面時發現均發起了新請求(藍框),這意味著Pragma字段的優先級會更高。

BUT,響應報文中Expires所定義的緩存時間是相對服務器上的時間而言的,如果客戶端上的時間跟服務器上的時間不一致(特別是用戶修改了自己電腦的系統時間),那緩存時間可能就沒啥意義了。

Cache-Control

針對上述的“Expires時間是相對服務器而言,無法保證和客戶端時間統一”的問題,http1.1新增了 Cache-Control 來定義緩存過期時間,若報文中同時出現了 Pragma、Expires 和 Cache-Control,會以 Cache-Control 為準。

Cache-Control也是一個通用首部字段,這意味著它能分別在請求報文和響應報文中使用。在RFC中規范了 Cache-Control 的格式為:

"Cache-Control" ":" cache-directive

作為請求首部時,cache-directive 的可選值有:

作為響應首部時,cache-directive 的可選值有:

我們依舊可以在HTML頁面加上meta標簽來給請求報頭加上 Cache-Control 字段:

另外 Cache-Control 允許自由組合可選值,例如:

Cache-Control: max-age=3600, must-revalidate

它意味著該資源是從原服務器上取得的,且其緩存(新鮮度)的有效時間為一小時,在后續一小時內,用戶重新訪問該資源則無須發送請求。

當然這種組合的方式也會有些限制,比如 no-cache 就不能和 max-age、min-fresh、max-stale 一起搭配使用。

組合的形式還能做一些瀏覽器行為不一致的兼容處理。例如在IE我們可以使用 no-cache 來防止點擊“后退”按鈕時頁面資源從緩存加載,但在 Firefox 中,需要使用 no-store 才能防止歷史回退時瀏覽器不從緩存中去讀取數據,故我們在響應報頭加上如下組合值即可做兼容處理:

Cache-Control: no-cache, no-store

緩存校驗字段

上述的首部字段均能讓客戶端決定是否向服務器發送請求,比如設置的緩存時間未過期,那么自然直接從本地緩存取數據即可(在chrome下表現為200 from cache),若緩存時間過期了或資源不該直接走緩存,則會發請求到服務器去。

我們現在要說的問題是,如果客戶端向服務器發了請求,那么是否意味著一定要讀取回該資源的整個實體內容呢?

我們試著這么想——客戶端上某個資源保存的緩存時間過期了,但這時候其實服務器并沒有更新過這個資源,如果這個資源數據量很大,客戶端要求服務器再把這個東西重新發一遍過來,是否非常浪費帶寬和時間呢?

答案是肯定的,那么是否有辦法讓服務器知道客戶端現在存有的緩存文件,其實跟自己所有的文件是一致的,然后直接告訴客戶端說“這東西你直接用緩存里的就可以了,我這邊沒更新過呢,就不再傳一次過去了”。

為了讓客戶端與服務器之間能實現緩存文件是否更新的驗證、提升緩存的復用率,Http1.1新增了幾個首部字段來做這件事情。

1. Last-Modified

服務器將資源傳遞給客戶端時,會將資源最后更改的時間以“Last-Modified: GMT”的形式加在實體首部上一起返回給客戶端。

客戶端會為資源標記上該信息,下次再次請求時,會把該信息附帶在請求報文中一并帶給服務器去做檢查,若傳遞的時間值與服務器上該資源最終修改時間是一致的,則說明該資源沒有被修改過,直接返回304狀態碼即可。

至于傳遞標記起來的最終修改時間的請求報文首部字段一共有兩個:

⑴ If-Modified-Since: Last-Modified-value

示例為 If-Modified-Since: Thu, 31 Mar 2016 07:07:52 GMT

該請求首部告訴服務器如果客戶端傳來的最后修改時間與服務器上的一致,則直接回送304 和響應報頭即可。

當前各瀏覽器均是使用的該請求首部來向服務器傳遞保存的 Last-Modified 值。

⑵ If-Unmodified-Since: Last-Modified-value

告訴服務器,若Last-Modified沒有匹配上(資源在服務端的最后更新時間改變了),則應當返回412(Precondition Failed) 狀態碼給客戶端。

當遇到下面情況時,If-Unmodified-Since 字段會被忽略:

1. Last-Modified值對上了(資源在服務端沒有新的修改);

2. 服務端需返回2XX和412之外的狀態碼;

3. 傳來的指定日期不合法

Last-Modified 說好卻也不是特別好,因為如果在服務器上,一個資源被修改了,但其實際內容根本沒發生改變,會因為Last-Modified時間匹配不上而返回了整個實體給客戶端(即使客戶端緩存里有個一模一樣的資源)。

2. ETag

為了解決上述Last-Modified可能存在的不準確的問題,Http1.1還推出了 ETag 實體首部字段。

服務器會通過某種算法,給資源計算得出一個唯一標志符(比如md5標志),在把資源響應給客戶端的時候,會在實體首部加上“ETag: 唯一標識符”一起返回給客戶端。

客戶端會保留該 ETag 字段,并在下一次請求時將其一并帶過去給服務器。服務器只需要比較客戶端傳來的ETag跟自己服務器上該資源的ETag是否一致,就能很好地判斷資源相對客戶端而言是否被修改過了。

如果服務器發現ETag匹配不上,那么直接以常規GET 200回包形式將新的資源(當然也包括了新的ETag)發給客戶端;如果ETag是一致的,則直接返回304知會客戶端直接使用本地緩存即可。

那么客戶端是如何把標記在資源上的 ETag 傳去給服務器的呢?請求報文中有兩個首部字段可以帶上 ETag 值:

⑴ If-None-Match: ETag-value

示例為 If-None-Match: "56fcccc8-1699"

告訴服務端如果 ETag 沒匹配上需要重發資源數據,否則直接回送304 和響應報頭即可。

當前各瀏覽器均是使用的該請求首部來向服務器傳遞保存的 ETag 值。

⑵ If-Match: ETag-value

告訴服務器如果沒有匹配到ETag,或者收到了“*”值而當前并沒有該資源實體,則應當返回412(Precondition Failed) 狀態碼給客戶端。否則服務器直接忽略該字段。

If-Match 的一個應用場景是,客戶端走PUT方法向服務端請求上傳/更替資源,這時候可以通過 If-Match 傳遞資源的ETag。

需要注意的是,如果資源是走分布式服務器(比如CDN)存儲的情況,需要這些服務器上計算ETag唯一值的算法保持一致,才不會導致明明同一個文件,在服務器A和服務器B上生成的ETag卻不一樣。

如果 Last-Modified 和 ETag 同時被使用,則要求它們的驗證都必須通過才會返回304,若其中某個驗證沒通過,則服務器會按常規返回資源實體及200狀態碼。

緩存實踐

當我們在一個項目上做http緩存的應用時,我們還是會把上述提及的大多數首部字段均使用上,例如使用 Expires 來兼容舊的瀏覽器,使用 Cache-Control 來更精準地利用緩存,然后開啟 ETag 跟 Last-Modified 功能進一步復用緩存減少流量。

那么這里會有一個小問題——Expires 和 Cache-Control 的值應設置為多少合適呢?

答案是不會有過于精準的值,均需要進行按需評估。

例如頁面鏈接的請求常規是無須做長時間緩存的,從而保證回退到頁面時能重新發出請求,百度首頁是用的 Cache-Control:private,騰訊首頁則是設定了60秒的緩存,即 Cache-Control:max-age=60。

而靜態資源部分,特別是圖片資源,通常會設定一個較長的緩存時間,而且這個時間最好是可以在客戶端靈活修改的。以騰訊的某張圖片為例:

http://i.gtimg.cn/vipstyle/vipportal/v4/img/common/logo.png?max_age=2592000

客戶端可以通過給圖片加上“max_age”的參數來定義服務器返回的緩存時間:

當然這需要有一個前提——靜態資源能確保長時間不做改動。如果一個腳本文件響應給客戶端并做了長時間的緩存,而服務端在近期修改了該文件的話,緩存了此腳本的客戶端將無法及時獲得新的數據。

解決該困擾的辦法也簡單——把服務側ETag的那一套也搬到前端來用——頁面的靜態資源以版本形式發布,常用的方法是在文件名或參數帶上一串md5或時間標記符:

https://hm.baidu.com/hm.js?e23800c454aa573c0ccb16b52665ac26

http://tb1.bdstatic.com/tb/_/tbean_safe_ajax_94e7ca2.js

http://img1.gtimg.com/ninja/2/2016/04/ninja145972803357449.jpg

如果文件被修改了,才更改其標記符內容,這樣能確保客戶端能及時從服務器收取到新修改的文件。

關于開頭的問題

現在回過頭來看文章開頭的問題,可能會覺得答案很容易回答出來。

百度首頁的資源在刷新后實際沒有發送任何請求,因為 Cache-Control 定義的緩存時間段還沒到期。在Chrome中即使沒發送請求,但只要從本地的緩存中取,都會在Network面板顯示一條狀態為200且注明“from cache”的偽請求,其Response內容只是上一次回包留下的數據。

然而這并不是問題的全部答案,我們前面提到過,在Chrome中如果點擊“刷新”按鈕,Chrome會強制給所有資源加上“Cache-Control: max-age=0”的請求首部并向服務器發送驗證請求的,而在文章開頭的動圖中,我們的確點擊了“刷新”按鈕,卻不見瀏覽器發去新請求(并返回304)。

關于這個問題其實在組內跟小伙伴們討論過,通過Fiddler抓包發現,如果關閉Chrome的開發者面板再點擊“刷新”按鈕,瀏覽器是會按預期發送驗證請求且接收返回的304響應的,另外這個奇怪的情況在不同的網站甚至不同的電腦下出現頻率都不一致,所以暫時將其歸咎于瀏覽器的怪異反應。

那么有這么一個問題——是否有辦法在瀏覽器點擊“刷新”按鈕的時候不讓瀏覽器去發新的驗證請求呢?

辦法還是有的,就是不怎么實用——在頁面加載完畢后通過腳本動態地添加資源:

  1. $(window).load(function() { 
  2.  
  3.       var bg='http://img.infinitynewtab.com/wallpaper/100.jpg'
  4.  
  5.       setTimeout(function() {  //setTimeout是必須的 
  6.  
  7.        $('#bgOut').css('background-image''url('+bg+')'); 
  8.  
  9.       },0); 
  10.  
  11. });  

出處來自知乎,更具體的解釋可以去看看。

其它相關的首部字段

事實上較常用和重要的緩存相關字段我們都介紹完了,這里順帶講講幾個跟緩存有關系,但沒那么主要的響應首部字段。

1. Vary

“vary”本身是“變化”的意思,而在http報文中更趨于是“vary from”(與。。。不同)的含義,它表示服務端會以什么基準字段來區分、篩選緩存版本。

我們先考慮這么一個問題——在服務端有著這么一個地址,如果是IE用戶則返回針對IE開發的內容,否則返回另一個主流瀏覽器版本的內容。這很簡單,服務端獲取到請求的 User-Agent 字段做處理即可。但是用戶請求的是代理服務器而非原服務器,且代理服務器如果直接把緩存的IE版本資源發給了非IE的客戶端,這就出問題了。

因此 Vary 便是著手處理該問題的首部字段,我們可以在響應報文加上:

  1. Vary: User-Agent 

便能知會代理服務器需要以 User-Agent 這個請求首部字段來區別緩存版本,防止傳遞給客戶端的緩存不正確。

Vary 也接受條件組合的形式:

  1. Vary: User-Agent, Accept-Encoding 

這意味著服務器應以 User-Agent 和 Accept-Encoding 兩個請求首部字段來區分緩存版本。

2. Date 和 Age

HTTP并沒有提供某種方法來幫用戶區分其收到的資源是否命中了代理服務器的緩存,但在客戶端我們可以通過計算響應報文中的 Date 和 Age 字段來得到答案。

Date 理所當然是原服務器發送該資源響應報文的時間(GMT格式),如果你發現 Date 的時間與“當前時間”差別較大,或者連續F5刷新發現 Date 的值都沒變化,則說明你當前請求是命中了代理服務器的緩存。

上述的“當前時間”自然是相對于原服務器而言的時間,那么如何獲悉原服務器的當前時間呢?

常規從頁面地址請求的響應報文中可獲得,以博客園首頁為例:

每次你刷新頁面,瀏覽器都會重新發出這條url的請求,你會發現其 Date 值是不斷變化的,這說明該鏈接沒有命中緩存,都是從原服務器返回過來的數據。

因此我們可以拿頁面上其它靜態資源請求回包中的 Date 與其進行對比,若靜態資源的 Date 早于原服務端時間,則說明命中了代理服務器緩存。

通常還滿足這么個條件:

靜態資源Age + 靜態資源Date = 原服務端Date

這里的 Age 也是響應報文中的首部字段,它表示該文件在代理服務器中存在的時間(秒),如文件被修改或替換,Age會重新由0開始累計。

我們在上面那張博客園首頁報文截圖的同個場景下,看看某個文件(jQuery.js)命中代理服務器緩存的回包數據:

會發現它滿足我們上述的規則:

  1. //return true 
  2.  
  3. new Date('Mon, 04 Apr 2016 07:03:17 GMT')/1000 == new Date('Sat, 19 Dec 2015 01:29:14 GMT')/1000 + 9264843 

不過這條規則也不一定準確,特別是當原服務器經常修改系統時間的情況下。

關于http緩存原理的知識就整理到這,希望能讓你有所收獲,共勉~ 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2017-04-26 14:15:35

瀏覽器緩存機制

2017-05-19 08:05:08

瀏覽器緩存HTTP

2021-08-02 13:05:49

瀏覽器HTTP前端

2018-08-07 10:44:50

緩存技術瀏覽器

2019-08-16 10:54:03

本地存儲javascripthttp緩存

2021-07-22 09:55:28

瀏覽器前端緩存

2016-01-05 12:54:52

瀏覽器瀏覽器端緩存

2017-09-28 12:03:40

前端

2020-03-11 20:42:34

瀏覽器緩存機制

2015-10-27 13:37:14

瀏覽器HTTP緩存

2009-07-10 18:15:24

HTTP頭

2009-06-22 14:06:00

java瀏覽器

2017-05-02 09:25:13

瀏覽器指紋追蹤虛擬化

2019-01-03 13:09:58

瀏覽器緩存原理

2011-06-10 16:44:17

Qt 瀏覽器

2020-11-30 07:02:43

瀏覽器緩存機制

2013-07-08 14:45:52

2020-10-29 11:04:28

緩存瀏覽器LocalStorag

2018-07-12 15:30:03

HTTP緩存機制

2020-07-16 08:04:21

瀏覽器緩存策略
點贊
收藏

51CTO技術棧公眾號

91久久夜色精品国产按摩| 三上悠亚国产精品一区二区三区| 韩日欧美一区二区三区| 欧美成人精品一区| 国产一级二级视频| 日本欧美一区| 亚洲永久精品大片| 欧美精品一区在线发布| 国产免费一区二区三区免费视频| 影音先锋在线一区| 在线观看国产成人av片| 麻豆免费在线观看视频| 欧美日韩视频免费观看| 一区二区三区四区乱视频| 久久久久综合一区二区三区| 亚洲天堂中文网| 在线亚洲自拍| 久久久av亚洲男天堂| 国产精品无码永久免费不卡| 玖玖精品在线| 欧美日韩黄色大片| 成人免费看片视频在线观看| 青青草视频在线免费观看| 国产综合久久久久久鬼色| 欧美专区福利在线| 顶臀精品视频www| 要久久电视剧全集免费| 欧美精品v国产精品v日韩精品| 欧美精品久久久久久久免费| 黄色成人影院| 中文字幕欧美激情| 九九九九久久久久| www.蜜臀av.com| 老司机免费视频一区二区三区| 2021久久精品国产99国产精品| 国产天堂av在线| 欧美视频免费| 亚洲码在线观看| 亚洲精品第二页| 美女久久精品| 欧美蜜桃一区二区三区| 十八禁视频网站在线观看| 成年人视频免费在线播放| 成人欧美一区二区三区在线播放| 日韩一区不卡| 免费黄色片在线观看| 91一区二区三区在线观看| 99中文字幕| 国产美女裸体无遮挡免费视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 2021国产精品视频| av大片免费在线观看| 极品裸体白嫩激情啪啪国产精品| 久久伊人精品一区二区三区| 99久久精品久久亚洲精品| 欧美系列电影免费观看| 亚洲人成自拍网站| 黄色aaa视频| 最新精品国偷自产在线| 亚洲女人被黑人巨大进入| 亚洲一区二区观看| 伊甸园亚洲一区| 亚洲欧美日本精品| www.99热| 天天影视欧美综合在线观看| 色偷偷噜噜噜亚洲男人| 日本爱爱小视频| 亚洲破处大片| 久久久久久69| 国产女同在线观看| 久久一区二区三区四区五区 | 欧美精品一区二区三区四区 | 国产精品沙发午睡系列| 韩国成人二区| 在线亚洲欧美专区二区| 黄色永久免费网站| 国产亚洲精aa在线看| 欧美xfplay| 久久人人爽人人爽人人片| 久久不卡国产精品一区二区| 亚洲最新av网址| 天天爽天天爽天天爽| 欧美影院一区| 午夜欧美不卡精品aaaaa| 日日噜噜噜噜人人爽亚洲精品| 久久午夜av| 成人av电影天堂| 黄色av中文字幕| 久久人人超碰精品| 一区二区三区国| 国内老司机av在线| 91黄色免费网站| 91在线第一页| 台湾色综合娱乐中文网| 最近免费中文字幕视频2019| 久草视频手机在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 国产视频福利一区| 欧美天堂在线视频| 欧美激情综合五月色丁香小说| 美国av在线播放| 僵尸再翻生在线观看| 欧美日韩国产一级片| 国产精久久久久| 国产一区日韩| 九九久久久久久久久激情| 亚洲va在线观看| 国产一区二区按摩在线观看| 国内视频一区二区| 黄色一级大片在线免费看产| 欧美午夜视频一区二区| 在线观看免费av网址| 九九热播视频在线精品6| 日韩在线观看av| 国产午夜免费福利| 国产精品123| 亚洲春色在线| 在线观看欧美日韩电影| 欧美v国产在线一区二区三区| 少妇人妻好深好紧精品无码| 亚洲综合激情在线| 国产精品麻豆va在线播放| 日日夜夜精品免费| 一区二区三区中文免费| jizz大全欧美jizzcom| 群体交乱之放荡娇妻一区二区 | 黄污视频在线观看| 欧美老女人第四色| av黄色在线免费观看| 国产农村妇女精品一区二区| 成人区精品一区二区| 麻豆视频在线观看免费网站| 欧美性大战久久| 中文字幕高清视频| 亚洲毛片一区| 国产高清一区视频| 18+视频在线观看| 欧美精品久久久久久久久老牛影院| 女人又爽又黄免费女仆| 日韩午夜一区| 国内精品**久久毛片app| 激情在线视频播放| 日韩欧美在线网站| 欧美黑人猛猛猛| 国内外成人在线| 一区二区不卡在线视频 午夜欧美不卡'| 欧美电影网址| 亚洲性av在线| 日本成人一级片| 中文字幕巨乱亚洲| 青青青国产在线视频| 少妇精品久久久一区二区| 91国产中文字幕| 亚洲三区在线观看无套内射| 欧美性猛交xxxx黑人| 久久狠狠婷婷| 五月天丁香久久| 三上悠亚在线一区二区| 亚洲三级网址| 全亚洲最色的网站在线观看| 亚洲精品久久久久久无码色欲四季 | 素人fc2av清纯18岁| 亚洲欧美日韩专区| 蜜桃免费一区二区三区| 伊人久久在线| 亚洲欧美999| 欧美h在线观看| 久久久国际精品| 国产视频一区二区视频| 成人影院天天5g天天爽无毒影院 | 国产精品久久久久久妇女| 亚洲欧美制服第一页| 丰满人妻一区二区三区四区| 国产精品免费aⅴ片在线观看| 三级av免费观看| 一区二区三区中文| 国产精品一区视频网站| 欲香欲色天天天综合和网| 国产一区二区三区在线播放免费观看| 最新中文字幕第一页| 1024成人网| av在线天堂网| 亚洲一区黄色| 亚洲激情电影在线| 精品视频一区二区三区| 性色av一区二区三区红粉影视| 美国成人毛片| 正在播放亚洲一区| 国产情侣在线视频| 中文字幕不卡三区| 精人妻一区二区三区| 久久婷婷一区| 国产又粗又大又爽的视频| 大桥未久女教师av一区二区| 日本一区二区在线播放| 久久国产精品一区| 日韩av在线高清| 亚洲视频中文字幕在线观看| 亚洲午夜影视影院在线观看| 欧美图片第一页| 国产精品一区二区三区四区| 丰满爆乳一区二区三区| 午夜欧美在线| 美日韩免费视频| 日本免费精品| 国产成人极品视频| 丝袜在线视频| 在线免费看av不卡| 天堂在线视频网站| 制服丝袜激情欧洲亚洲| 国产真人无遮挡作爱免费视频| 依依成人精品视频| 国产精品理论在线| 91原创在线视频| 91精产国品一二三| 久久精品国产精品亚洲精品| 国产白丝袜美女久久久久| 亚洲欧美网站在线观看| 午夜精品一区二区三区四区| 成人欧美一区二区三区在线观看| 1pondo在线播放免费| 亚洲福利视频网站| 国产精品污视频| 一本久久a久久免费精品不卡| www.av视频| 中文字幕av一区 二区| 亚洲色图14p| 国产精品1区2区| 亚洲最大综合网| 999亚洲国产精| 阿v天堂2018| 天天做天天爱天天综合网| 欧美一卡2卡3卡4卡无卡免费观看水多多| 激情视频亚洲| 国产一区二区在线免费视频| 欧美最新精品| 日本久久亚洲电影| 日本在线播放一二三区| 欧美激情在线观看视频| 国产黄色在线免费观看| 久久精品成人欧美大片古装| av大片在线看| 一区二区福利视频| 精品无吗乱吗av国产爱色| 国产视频自拍一区| 婷婷av一区二区三区| 精品电影一区二区三区| 高清乱码毛片入口| 亚洲成人激情视频| 国产自产一区二区| 亚洲国产高清高潮精品美女| 精品久久久久中文慕人妻| 欧美一区二区三区在线电影| 国产精品伦一区二区三区| 欧美日本在线看| 国产毛片久久久久| 日韩欧美电影一二三| 懂色av蜜臀av粉嫩av分享吧| 亚洲国产精品免费| 国产精品国产高清国产| 国产丝袜精品第一页| 番号集在线观看| 色视频www在线播放国产成人| 亚洲搞黄视频| 欧美精品做受xxx性少妇| 欧美1—12sexvideos| 91国产在线精品| 免费观看成人性生生活片| 国产精品久久久久久久久久久久久| 福利一区在线| 亚洲www永久成人夜色| 国产精品115| 欧美日韩一区二区三区在线视频 | 欧美精品日日操| 国产成一区二区| 成人免费91| 国产精品日韩欧美一区二区三区| 蜜桃一区av| 相泽南亚洲一区二区在线播放| 天天av综合| 极品粉嫩国产18尤物| 日韩在线一区二区三区| 手机在线国产视频| www.欧美色图| 欧美自拍偷拍网| 亚洲一区二区三区四区五区黄 | 免费a在线看| 国内精品视频久久| 亚洲天堂资源| 91免费版网站入口| 青青一区二区| 中文字幕中文字幕在线中一区高清| 黄色亚洲在线| 色婷婷狠狠18| 懂色一区二区三区免费观看| 黄免费在线观看| 一区二区三区色| 无码人妻av一区二区三区波多野| 91精品国产欧美一区二区| 视频二区在线| 久久不射热爱视频精品| 625成人欧美午夜电影| 91视频免费在线| 国产精品美女久久久久久不卡 | 青春草免费在线视频| 国产福利精品av综合导导航| 国产区一区二| 欧美极品色图| 亚洲网站在线| 九九热免费在线观看| 91蜜桃免费观看视频| 久久高清内射无套| 欧美视频一区二区三区在线观看| 好吊色一区二区三区| 俺也去精品视频在线观看| 亚洲综合电影| 国产精品久久久久久免费观看| 日韩情爱电影在线观看| 免费高清在线观看免费| 国产传媒一区在线| 久久精品在线观看视频| 91成人免费在线| 天天操天天射天天舔| 欧美成人三级视频网站| 精品女同一区二区三区在线观看| 欧美12av| 一本色道久久综合| 中文字幕第九页| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲中文字幕无码爆乳av| 精品无人国产偷自产在线| 高潮在线视频| 国产精品乱子乱xxxx| 欧美三级视频| 97超碰人人看| 亚洲人精品午夜| 国产精品欧美激情在线| 丝袜美腿精品国产二区 | 成人精品一区二区三区电影免费 | 久久国产黄色片| 亚洲精品av在线播放| 成人性生交大片免费看网站| 岛国视频一区| 国语对白精品一区二区| 91精品国产高清91久久久久久| 亚洲美女淫视频| www男人的天堂| 欧美福利小视频| 中文字幕久久精品一区二区| 老司机午夜免费福利视频| 国产精品亚洲一区二区三区在线| 国产97免费视频| 日韩欧美亚洲另类制服综合在线| 天天干在线视频论坛| 成人综合av网| 午夜一级久久| 一级特黄曰皮片视频| 欧美色图天堂网| 国产精品一区二区三区视频网站| 91九色精品视频| 欧美fxxxxxx另类| 日本一卡二卡在线| 色婷婷综合视频在线观看| 成人精品一区二区| 91精品视频一区| 在线成人国产| 欧洲av一区二区三区| 欧美日韩高清影院| 五月天激情在线| 国产一区二区无遮挡| 免费日韩av| 18啪啪污污免费网站| 91精品国产综合久久久久久久 | 国产精品第二页| 国产大片一区| 99久久久无码国产精品性波多 | av天堂一区二区三区| 久久久久久高潮国产精品视| 欧美色图五月天| 韩国视频一区二区三区| 亚洲精品中文字幕在线观看| 日本加勒比一区| 国产精品色悠悠| 欧美日韩综合| 国产成人av一区二区三区不卡| 欧美日韩和欧美的一区二区| 日本在线视频www鲁啊鲁| 欧美高清视频一区| 国产在线观看免费一区| 日韩男人的天堂| 日韩中文字幕视频在线观看| a看欧美黄色女同性恋| 97超碰青青草| 亚洲欧美日韩一区二区| 午夜成人免费影院| 成人午夜激情免费视频| 久久动漫亚洲| 久久中文字幕在线观看| 中国人与牲禽动交精品| 国产美女撒尿一区二区|