HTTP æ¡ä»¶è¯·æ±
å¨ HTTP 䏿ä¸ä¸ªæ¡ä»¶è¯·æ±çæ¦å¿µï¼å¨è¿ç±»è¯·æ±ä¸ï¼è¯·æ±çç»æï¼çè³è¯·æ±æåçç¶æï¼é½ä¼éçéªè¯å¨ä¸åå½±åèµæºçæ¯è¾ç»æçååèååãè¿ç±»è¯·æ±å¯ä»¥ç¨æ¥éªè¯ç¼åçæææ§ï¼çå»ä¸å¿ è¦çæ§å¶ææ®µï¼ä»¥åéªè¯æä»¶ç宿´æ§ï¼ä¾å¦å¨æç¹ç»ä¼ çåºæ¯ä¸æè å¨ä¸ä¼ æè ä¿®æ¹æå¡å¨ç«¯çæä»¶çæ¶åé¿å æ´æ°ä¸¢å¤±é®é¢ã
åºæ¬åç
å¨ HTTP åè®®ä¸ï¼æ¡ä»¶è¯·æ±æçæ¯è¯·æ±çæ§è¡ç»æä¼å ç¹å®é¦é¨çå¼ä¸åèä¸åãè¿äºé¦é¨è§å®äºè¯·æ±çåç½®æ¡ä»¶ï¼è¯·æ±ç»æåè§æ¡ä»¶å¹é ä¸å¦èææä¸åã
请æ±å¼åçä¸åçååºåå³äºè¯·æ±æä½¿ç¨çæ¹æ³ï¼ä»¥åç»æåç½®æ¡ä»¶é¦é¨éåï¼
- 对äºå®å
¨æ¹æ³æ¥è¯´ï¼ä¾å¦
GETï¼éå¸¸ç¨æ¥è·åæä»¶ï¼æ¡ä»¶è¯·æ±å¯ä»¥è¢«ç¨æ¥éå®ä» 卿»¡è¶³æ¡ä»¶çæ åµä¸è¿åæä»¶ãè¿æ ·å¯ä»¥èç带宽ã - 对äºéå®å
¨æ¹æ³æ¥è¯´ï¼ä¾å¦
PUTæ¹æ³ï¼éå¸¸ç¨æ¥ä¸ä¼ æä»¶ï¼æ¡ä»¶è¯·æ±å¯ä»¥è¢«ç¨æ¥éå®ä» 卿»¡è¶³æä»¶çåå§çæ¬ä¸æå¡å¨ä¸ççæ¬ç¸åçæ¡ä»¶ä¸æä¼å°å ¶ä¸ä¼ ã
éªè¯å¨
ææçæ¡ä»¶è¯·æ±é¦é¨é½æ¯è¯å¾å»æ£æµæå¡å¨ä¸åå¨çèµæºæ¯å¦ä¸æä¸ç¹å®çæ¬ç¸å¹é ã为äºè¾¾å°è¿ä¸ªç®çï¼æ¡ä»¶è¯·æ±éè¦ææèµæºççæ¬ãç±äºé个åè廿¯è¾å®æ´èµæºæ¯ä¸åå®é çï¼åµä¸è¿ä¹å¹¶éæ»æ¯æ³è¦çç»æï¼æä»¥å¨è¯·æ±ä¸ä¼ä¼ éä¸ä¸ªæè¿°èµæºçæ¬çå¼ãè¿äºå¼ç§°ä¸ºâéªè¯å¨âï¼å¹¶ä¸å为两大类ï¼
- æä»¶çæåä¿®æ¹æ¶é´ï¼å³ last-modifiedï¼æåä¿®æ¹ï¼æ¶é´ã
- ä¸ä¸ªæä¹æ¨¡ç³çåç¬¦ä¸²ï¼æä»£ä¸ä¸ªç¬ä¸æ äºççæ¬ï¼ç§°ä¸ºâå®ä½æ ç¾âï¼æè etagã
æ¯è¾åä¸ä»½èµæºçä¸åçæ¬æä¸å®çæå·§æ§ï¼åå³äºä¸ä¸æç¯å¢çä¸åï¼æä¸¤ç§ä¸åçç弿£æ¥ï¼equality checksï¼ç±»åï¼
- 强éªè¯ç±»åï¼Strong validationï¼åºç¨äºéè¦é个åèç¸å¯¹åºçæ åµï¼ä¾å¦éè¦è¿è¡æç¹ç»ä¼ çæ¶åã
- å¼±éªè¯ç±»åï¼Weak validationï¼åºç¨äºç¨æ·ä»£çåªéè¦ç¡®è®¤èµæºå 容ç¸åå³å¯ãå³ä¾¿æ¯æç»å¾®å·®å«ä¹å¯ä»¥æ¥åï¼æ¯å¦æ¾ç¤ºç广åä¸åï¼æè æ¯é¡µèçæ¶é´ä¸åã
éªè¯ç±»åä¸éªè¯å¨çç±»åæ¯ç¸äºç¬ç«çã Last-Modified å ETag é¦é¨åå¯åºç¨äºä¸¤ç§éªè¯ç±»åï¼å°½ç®¡å¨æå¡å¨ç«¯å®ç°ç夿ç¨åº¦å¯è½ä¼ææä¸åãHTTP åè®®é»è®¤ä½¿ç¨å¼ºéªè¯ç±»åï¼å¯ä»¥æå®ä½æ¶ä½¿ç¨å¼±éªè¯ç±»åã
强éªè¯ç±»å
强éªè¯ç±»åçä½ç¨å¨äºç¡®ä¿è¦æ¯è¾çèµæºä¸å ¶ç¸æ¯è¾ç对象ä¹é´æ¯ä¸ä¸ªåèé½ç¸åãå¯¹äºæäºé¦é¨æ¥è¯´éè¦æç¡®æå®è¯¥éªè¯ç±»åï¼è对äºå¦å¤ä¸äºæ¥è¯´åæ¯é»è®¤å¼å°±æ¯å¼ºéªè¯ç±»åã强éªè¯ç±»åçè¦æ±ç¸å½ä¸¥æ ¼ï¼å¨æå¡å¨å±é¢æ¥è¯´å¯è½è¾é¾ä¿è¯ã使¯å®ç¡®ä¿äºæ°æ®å¨ä»»ä½æ¶å齿²¡æç¼ºæï¼ææ¶ååéè¦ä»¥çºç²æ§è½ä¸ºä»£ä»·ã
ä½¿ç¨ Last-Modified é¦é¨å¾é¾ä¸ºå¼ºéªè¯ç±»åæä¾ä¸ä¸ªå¯ä¸æ è¯ãéå¸¸è¿æ¯ç± ETag é¦é¨æ¥å®æçï¼è¯¥é¦é¨å¯ä»¥æä¾ä½¿ç¨ MD5 ç®æ³è·åçèµæºï¼æå
¶è¡çåï¼çæ£åå¼ã
å¼±éªè¯ç±»å
å¼±éªè¯ç±»åä¸å¼ºéªè¯ç±»åä¸åï¼å 为å®ä¼æå 容ç¸åç两份æä»¶ç忝䏿 ·çãä¾å¦ï¼ä½¿ç¨å¼±éªè¯ç±»åï¼ä¸ä¸ªé¡µé¢ä¸å¦å¤ä¸ä¸ªé¡µé¢åªæ¯å¨é¡µèæ¾ç¤ºçæ¶é´ä¸ææä¸åï¼æè æ¯å±ç¤ºç广åä¸ç¸åï¼é£ä¹å°±ä¼è¢«è®¤ä¸ºæ¯ç¸åçã使¯å¨ä½¿ç¨å¼ºéªè¯çæ åµä¸ï¼äºè æ¯ä¸åçãæå»ºåºç¨äºå¼±éªè¯ç±»åçæ ç¾ï¼etagï¼ä½ç³»å¯è½ä¼æ¯è¾å¤æï¼å 为è¿ä¼æ¶åå°å¯¹é¡µé¢ä¸ä¸åçå ç´ çéè¦æ§è¿è¡æåºï¼ä½æ¯ä¼å¯¹ç¼åæ§è½ä¼åç¸å½æå¸®å©ã
æ¡ä»¶é¦é¨
ä¸äºè¢«ç§°ä¸ºæ¡ä»¶é¦é¨ç HTTP é¦é¨ï¼å¯ä»¥å¼åæ¡ä»¶è¯·æ±ãå®ä»¬æ¯ï¼
If-Match-
妿è¿ç«¯èµæºçå®ä½æ ç¾ä¸å¨
ETagè¿ä¸ªé¦é¨ä¸ååºçå¼ç¸åçè¯ï¼è¡¨ç¤ºæ¡ä»¶å¹é æåãé»è®¤å°ï¼é¤éå®ä½æ ç¾å¸¦æ 'W/' åç¼ï¼å¦è å®å°ä¼æ§è¡å¼ºéªè¯ã If-None-Match-
妿è¿ç«¯èµæºçå®ä½æ ç¾ä¸å¨
ETagè¿ä¸ªé¦é¨ä¸ååºçå¼é½ä¸ç¸åçè¯ï¼è¡¨ç¤ºæ¡ä»¶å¹é æåãé»è®¤å°ï¼é¤éå®ä½æ ç¾å¸¦æ 'W/' åç¼ï¼å¦è å®å°ä¼æ§è¡å¼ºéªè¯ã If-Modified-Since-
妿è¿ç«¯èµæºç
Last-Modifiedé¦é¨æ è¯çæ¥ææ¯å¨è¯¥é¦é¨ä¸ååºçå¼è¦æ´æï¼è¡¨ç¤ºæ¡ä»¶å¹é æåã If-Unmodified-Since-
妿è¿ç«¯èµæºç HTTPHeader("Last-Modified")}} é¦é¨æ è¯çæ¥ææ¯å¨è¯¥é¦é¨ä¸ååºçå¼è¦æ´æ©æç¸åï¼è¡¨ç¤ºæ¡ä»¶å¹é æåã
If-Range-
ä¸
If-MatchæIf-Unmodified-Sinceç¸ä¼¼ï¼ä½æ¯åªè½å«æä¸ä¸ªå®ä½æ ç¾æè æ¥æå¼ã妿å¹é 失败ï¼åæ¡ä»¶è¯·æ±å®£åå¤±è´¥ï¼æ¤æ¶å°ä¸ä¼è¿å206Partial Contentååºç ï¼èæ¯è¿å200OKååºç ï¼ä»¥å宿´çèµæºã
åºç¨åºæ¯
>ç¼åæ´æ°
æ¡ä»¶å¼è¯·æ±æå¸¸è§çåºç¨åºæ¯æ¯æ´æ°ç¼åãåå¦ç¼åä¸ºç©ºï¼æè
æ¯æ²¡æç¼åçè¯ï¼è¢«è¯·æ±èµæºä¼ä»¥ç¶æç 200 OK è¿åã
éªè¯å¨ä¼åèµæºä¸èµ·è¿åï¼å®ä»¬åºç°å¨é¦é¨å段ä¸ãå¨è¿ä¸ªä¾åä¸ï¼ Last-Modified ä¸ ETag é½è¢«è¿åï¼ä¸è¿å¦æåªè¿åå
¶ä¸çä¸ä¸ªä¹æ¯å¯ä»¥çãè¿äºéªè¯å¨ä¼åèµæºä¸èµ·è¢«ç¼åèµ·æ¥ï¼ä¸ææçé¦é¨ä¸æ ·ï¼ï¼å¹¶å¨å¨ç¼å失æçæ¶åç¨æ¥åèµ·æ¡ä»¶å¼è¯·æ±ã
åªè¦ç¼åæªå¤±æï¼å°±ä¸ä¼åèµ·ä»»ä½è¯·æ±ã使¯ä¸æ¦å¤±æââä¸»è¦æ¯ç± Cache-Control é¦é¨æ§å¶ââ客æ·ç«¯å°±ä¸ä¼éç¨ç¼åå¼èæ¯åèµ·æ¡ä»¶å¼è¯·æ±ãéªè¯å¨çå¼ä¼ç¨ä½ If-Modified-Since å If-None-Match é¦é¨å段çåæ°ã
åå¦èµæºæªåçååï¼æå¡å¨å°±è¿åç¶æç 为 304 Not Modified çååºãè¿æ ·ç¸å½äºå¯¹ç¼åèµæºè¿è¡äºå·æ°ï¼è客æ·ç«¯åéç¨è¢«ç¼åçèµæºã尽管è¿éæä¸æ¬¡è¯·æ±/ååºå¾è¿ä¼æ¶èä¸å®çèµæºï¼ä½æ¯è¿æ ·åæ¯å°æ´ä¸ªèµæºéè¿ç½ç»åä¼ è¾ä¸éæ´é«æã
åå¦èµæºåçäºååï¼æå¡å¨å°±ç´æ¥è¿å 200 OK ååºç ï¼è¿åæ°çæ¬çèµæºï¼å°±åæ¯æ²¡æåºç¨æ¡ä»¶å¼è¯·æ±ä¸æ ·ï¼å®¢æ·ç«¯åéç¨æ°çæ¬èµæºï¼å¹¶å°å
¶ç¼åèµ·æ¥ï¼ã
é¤äºéè¦å¨æå¡å¨ç«¯å¯¹éªè¯å¨è¿è¡è®¾ç½®ä»¥å¤ï¼è¯¥æºå¶æ¯éæçï¼ææçæµè§å¨é½ä¼å¯¹ç¼åèµæºè¿è¡ç®¡çï¼å¨ä¸éè¦ Web å¼åè è¿è¡ä»»ä½ç¹æ®å¤ççæ åµä¸å鿡件å¼è¯·æ±ã
å¢éä¸è½½ç宿´æ§
æä»¶çå¢éä¸è½½æ¯ HTTP åè®®è§å®çä¸é¡¹åè½ï¼å®å 许æ¢å¤å åçæä½ï¼éè¿ä¿åå åå·²ç»è·å¾çä¿¡æ¯æ¥èç另宽忶é´ï¼
æ¯æå¢éä¸è½½çæå¡å¨ä¼éè¿ Accept-Ranges é¦é¨æ¥å¹¿æè¿é¡¹è½åãæ¤å客æ·ç«¯å°±å¯ä»¥éè¿åé Ranges é¦é¨å段以å缺失çèå´å¼æ¥è¿è¡æç¹ç»ä¼ äºï¼
åºæ¬åçå¾ç®åï¼ä½æ¯è¿éæä¸ä¸ªæ½å¨çé®é¢ï¼å¦æè¦ä¸è½½çèµæºå¨ä¸¤æ¬¡ä¸è½½ä¹é´è¿è¡äºä¿®æ¹ï¼å¾å°çæ°æ®èå´å°±ä¼å¯¹åºè¯¥èµæºç两个ä¸åççæ¬ï¼é£ä¹æç»è·å¾çæä»¶æ¯æåçã
为äºé²æ¢è¿ç§æ
åµçåçï¼éè¦ä½¿ç¨æ¡ä»¶å¼è¯·æ±ã对äºèå´è¯·æ±æ¥è¯´ï¼æä¸¤ç§æ¹æ³å¯ä»¥å®ç°è¿ä¸ªç®çãæ´çµæ´»ä¸äºçæ¹æ³æ¯ä½¿ç¨ If-Modified-Since å If-Match é¦é¨ï¼åå¦åç½®æ¡ä»¶å¤±è´¥ï¼æå¡å¨ç«¯ä¼è¿åé误æç¤ºï¼ç¶å客æ·ç«¯å¯ä»¥ä»å¤´å¼å§éæ°ä¸è½½èµæºï¼
尽管è¿ç§æ¹æ³è¡å¾éï¼ä½æ¯å®å¨æä»¶åçååçæ
åµä¸å¢å äºä¸æ¬¡é¢å¤ç请æ±/ååºå¾è¿ãè¿ä¸ç¹ä¼å½±åæ§è½ãä¸ºæ¤ HTTP åè®®è§å®äºä¸ä¸ªç¹å®çé¦é¨ââIf-Rangeââæ¥é¿å
è¿ç§æ
åµçåçï¼
è¯¥æ¹æ³æ´é«æï¼ä½æ¯ç¼ºä¹ä¸å®ççµæ´»æ§ï¼å 为æ¡ä»¶å¼åªè½æ¯å®ä½æ ç¾ãä¸è¿è¿ç§é¢å¤ççµæ´»æ§å¾å°ä¼éè¦ã
使ç¨ä¹è§éé¿å æ´æ°ä¸¢å¤±é®é¢
å¯¹äº Web åºç¨çä¸é¡¹å¸¸è§æä½æ¯è¿ç¨æ´æ°æä»¶ãè¿å¨åç§ç±»åçæä»¶ç³»ç»ä»¥åçæ¬æ§å¶è½¯ä»¶ä¸é½å¾å¸¸è§ï¼ä½æ¯ä»»ä½å 许è¿ç¨åå¨èµæºç软件ä¹é½éè¦è¿æ ·ä¸ä¸ªä¹è§éæºå¶ã常è§ç Web ç«ç¹ï¼ä¾å¦ wiki ç³»ç»æå ¶ä»ç±»åçå 容管çç³»ç»ï¼CMSï¼ï¼é½åå¨è¿æ ·çéæ±ã
ä½¿ç¨ PUT æ¹æ³å¯ä»¥å®ç°ä¸è¿°æºå¶ã客æ·ç«¯é¦å
读ååå§æä»¶ï¼ç¶åè¿è¡ä¿®æ¹ï¼æåå°å®ä»¬æ¨éå°æå¡å¨ä¸ï¼
ä¸å¹¸çæ¯ï¼å½æå¹¶åæ åµèèå¨å çæ¶åï¼äºæ å徿äºä¸é£ä¹ç¡®å®ãå½ä¸ä¸ªå®¢æ·ç«¯å¨æ¬å°ä¿®æ¹å®æ°è·å¾çèµæºå¯æ¬çæ¶åï¼å¦å¤ä¸ä¸ªå®¢æ·ç«¯åæ ·å¯ä»¥è·åä¸ä»½èµæºå¯æ¬å¹¶è¿è¡åæ ·çæä½ãæ¥ä¸æ¥è¦åççäºæ å°±ä¸é£ä¹é¡ºå©äºï¼å½äºè æäº¤åæå¡å¨çæ¶åï¼åä¸ä¸ªå®¢æ·ç«¯ä½åºçä¿®æ¹ä¼è¢«ç¬¬äºä¸ªå®¢æ·ç«¯çæ¨éæè¦çï¼å 为第äºä¸ªå®¢æ·ç«¯å¯¹äºç¬¬ä¸ä¸ªå®¢æ·ç«¯ååºçä¿®æ¹ä¸æ æç¥ãæç»çç»æååå³äºè·èç䏿¹ï¼ä½æ¯è¯¥ç»æä¸ä¼éç¥ç»å¦ä¸æ¹ãåªä¸ä¸ªå®¢æ·ç«¯ä½åºçä¿®æ¹å°ä¼è¢«ä¿å䏿¥ï¼ä¼ç±äºå®ä»¬æäº¤çéåº¦èææä¸åï¼æäº¤çé度åä¾èµäºå®¢æ·ç«¯åæå¡å¨ç«¯çæ§è½ï¼çè³æ¯ä½¿ç¨å®¢æ·ç«¯è¿è¡ç¼è¾ç人ç表ç°ãæ¯ä¸æ¬¡çèåºè é½ä¼ææä¸åãè¿ç§æ åµè¢«ç§°ä½ç«ææ¡ä»¶ï¼ä¼å¯¼è´é¾ä»¥ææ¸çæ åµçåçï¼å¹¶ä¸é¾ä»¥æ¢æµåé¤éï¼
ä¸åå¨è§£å³è¿ä¸é®é¢è䏿æ°åæ¹æä¸æ¹çåæ³ãç¶èï¼æ´æ°ä¸¢å¤±é®é¢ä»¥åç«ææ¡ä»¶æ¯éè¦é¿å çãæä»¬å¸æè·å¾å¯é¢æµçç»æï¼å¹¶ä¸å¸æå¨æ´æ°æä½è¢«æç»çæ¶å客æ·ç«¯å¯ä»¥å¾å°åé¦ã
æ¡ä»¶å¼è¯·æ±å¯ä»¥è¢«ç¨å¨ä¹è§éç®æ³ï¼å¤§å¤æ° wiki ç³»ç»åçæ¬ç®¡çç³»ç»éç¨çæ¯è¯¥ç®æ³ï¼çå®ç°ä¸ãå ¶æè·¯æ¯ï¼å 许ææç客æ·ç«¯è·å¾èµæºç坿¬ï¼ç¶å卿¬å°è¿è¡ç¼è¾ï¼éè¿åªå 许第ä¸ä¸ªå®¢æ·ç«¯æåæäº¤çæ¹å¼æ¥æ§å¶å¹¶åæä½ãå ¶ä½çåºäºç°ä»å·²è¿æçæ¬çæ´æ°æä½é½ä¼è¢«æç»ï¼
è¿ç§æ¹å¼çå®ç°éè¦ç¨å° If-Match æ If-Unmodified-Since é¦é¨ãåå¦å®ä½æ ç¾ä¸æºå¤´æä»¶çå®ä½æ ç¾ä¸ä¸è´ï¼æè
æºå¤´æä»¶å¨è¢«è·å坿¬ä¹åç»è¿äºä¿®æ¹ï¼é£ä¹æ¤æ¬¡åæ´è¯·æ±å°±ä¼è¢«æç»ï¼æ¶å° 412 Precondition Failed çé误æç¤ºãä¹åå°±éè¦ä¾é 客æ·ç«¯æ¥å¤ç该é误äºï¼æè
éç¥ç¨æ·éæ°å¼å§ï¼åºäºææ°ççæ¬ï¼ï¼æè
æ¯ç»ç¨æ·å±ç¤ºä¸¤ä¸ªçæ¬ä¹é´çå·®å¼ï¼è¾
å©ä»ä»¬å³å®è¦ä¿çåªäºåæ´ã
å¤çèµæºç馿¬¡ä¸ä¼ é®é¢
èµæºç馿¬¡ä¸ä¼ é®é¢æ¯å颿æè¿°çæ
åµçä¸ä¸ªæç«¯æ
åµãä¸ä»»ä½èµæºæ´æ°é®é¢ä¸æ ·ï¼å½ä¸¤ä¸ªå®¢æ·ç«¯å¨å¤§è´ç¸åçæ¶é´è¿è¡ä¸ä¼ æä½çæ¶åï¼å°±ä¼éå°ç«ææ¡ä»¶ã为äºé²æ¢è¿ç§æ
åµçåçï¼å¯ä»¥ä½¿ç¨æ¡ä»¶å¼è¯·æ±ï¼æ·»å If-None-Match é¦é¨ï¼å¹¶å°å
¶å¼è®¾ç½®ä¸º '*', 表示任æå®ä½æ ç¾ãå½ä¸ä»
å½èµæºå
åå¹¶ä¸åå¨çæ
åµä¸è¯·æ±çæä½æä¼æåæ§è¡ï¼
If-None-Match é¦é¨åªå¯åºç¨äºå
¼å®¹ HTTP/1.1ï¼ååç»çæ¬ï¼çæå¡å¨ãåå¦ä¸ç¡®å®æè®¿é®çæå¡å¨æ¯å¦å
¼å®¹ï¼éè¦é¦å
åè¦è®¿é®çèµæºåé䏿¬¡ HEAD è¯·æ±æ¥è¿è¡ç¡®è®¤ã
æ»ç»
æ¡ä»¶å¼è¯·æ±æ¯ HTTP åè®®ä¸ä¸é¡¹é常éè¦çç¹æ§ï¼å®ä½¿é«æå¤æçåºç¨ç³»ç»çæå»ºå¾ä»¥å®ç°ã对äºç¼åææç¹ç»ä¼ åè½æ¥è¯´ï¼ç«ç¹ç®¡çååªéè¦æ£ç¡®é ç½®æå¡å¨å°±å¯ä»¥äºï¼å¨æäºç¯å¢ä¸è®¾ç½®æ£ç¡®çå®ä½æ ç¾å¯è½éè¦ä¸äºæå·§ãä½ä¸æ¦è®¾ç½®æåï¼æµè§å¨å°±è½å¤æç §é¢æå°å鿡件å¼è¯·æ±ã
è对äºéæºå¶ï¼åæ°æ°ç¸åï¼Web å¼åè éè¦ä½¿ç¨åéçæ¶æ¯é¦é¨çæè¯·æ±ï¼å¦ä¸æ¹é¢ï¼ç«ç¹ç®¡çåå¨å¤§å¤æ¶åå¯ä»¥ä¾èµåºç¨æ¥æ£æ¥è¿äºé¦é¨ä¿¡æ¯ã
æ¾ç¶å¨ä¸¤ç§æ åµä¸ï¼æ¡ä»¶å¼è¯·æ±é½åæ¥çåºç¡æ§ä½ç¨ï¼æä¸º Web åºç¨çæåæ¯æã