ä¸ã请æ±ç±»å
ä¸ç§æ常è§ç请æ±ç±»åæ¯ï¼GETãPOST å HEAD
1.1ãGETï¼è·åä¸ä¸ªææ¡£
大é¨åè¢«ä¼ è¾å°æµè§å¨çhtmlï¼imagesï¼jsï¼css, ⦠é½æ¯éè¿GETæ¹æ³ååºè¯·æ±çãå®æ¯è·åæ°æ®ç主è¦æ¹æ³ã
ä¾å¦ï¼è¦è·åNettuts+ çæç« ï¼http requestç第ä¸è¡é常çèµ·æ¥æ¯è¿æ ·çï¼
ä¸æ¦htmlå è½½å®æï¼æµè§å¨å°ä¼åéGET 请æ±å»è·åå¾çï¼å°±åä¸é¢è¿æ ·ï¼
表åä¹å¯ä»¥éè¿GETæ¹æ³åéï¼ä¸é¢æ¯ä¸ªä¾åï¼
First Name:
Last Name:
å½è¿ä¸ªè¡¨å被æ交æ¶ï¼HTTP request å°±ä¼åè¿æ ·ï¼
GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1
...
ä½ å¯ä»¥å°è¡¨åè¾å ¥éè¿éå è¿æ¥è¯¢å符串çæ¹å¼åéè³æå¡å¨ã
1.2ãPOSTï¼åéæ°æ®è³æå¡å¨
å°½ç®¡ä½ å¯ä»¥éè¿GETæ¹æ³å°æ°æ®éå å°urlä¸ä¼ éç»æå¡å¨ï¼ä½å¨å¾å¤æ åµä¸ä½¿ç¨POSTåéæ°æ®ç»æå¡å¨æ´å åéãéè¿GETåé大éæ°æ®æ¯ä¸ç°å®çï¼å®æä¸å®çå±éæ§ã
ç¨POST请æ±æ¥åé表åæ°æ®æ¯æ®éçåæ³ãæ们æ¥å§ä¸é¢çä¾åæ¹é æ使ç¨POSTæ¹å¼ï¼
First Name:
Last Name:
æ交è¿ä¸ªè¡¨åä¼å建ä¸ä¸ªå¦ä¸çHTTP 请æ±ï¼
POST /foo.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost/test.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 43
first_name=John&last_name=Doe&action=Submit
è¿éæä¸ä¸ªéè¦æ³¨æçå°æ¹ï¼
- 第ä¸è¡çè·¯å¾å·²ç»å为ç®åç /foo.php , å·²ç»æ²¡äºæ¥è¯¢å符串ï¼
- æ°å¢äº Content-Type å Content-Lenght 头é¨ï¼å®æä¾äºåéä¿¡æ¯çç¸å ³ä¿¡æ¯ï¼
- æææ°æ®é½å¨headersä¹åï¼ä»¥æ¥è¯¢å符串çå½¢å¼è¢«åéã
POSTæ¹å¼ç请æ±ä¹å¯ç¨å¨AJAXï¼åºç¨ç¨åºï¼curl ⦠ä¹ä¸ã并ä¸ææçæ件ä¸ä¼ 表åé½è¢«è¦æ±ä½¿ç¨POSTæ¹å¼ã
1.3ãHEADï¼æ¥æ¶å¤´é¨ä¿¡æ¯
HEADåGETå¾ç¸ä¼¼ï¼åªä¸è¿HEADä¸æ¥åHTTPååºçå 容é¨åãå½ä½ åéäºä¸ä¸ªHEAD请æ±ï¼é£å°±æå³çä½ åªå¯¹HTTP头é¨æå ´è¶£ï¼èä¸æ¯ææ¡£æ¬èº«ã
è¿ä¸ªæ¹æ³å¯ä»¥è®©æµè§å¨å¤æ页é¢æ¯å¦è¢«ä¿®æ¹è¿ï¼ä»èæ§å¶ç¼åãä¹å¯å¤ææ请æ±çææ¡£æ¯å¦åå¨ã
ä¾å¦ï¼åå¦ä½ è¦è®¿é®çç½ç«ä¸æå¾å¤é¾æ¥ï¼é£ä¹ä½ å°±å¯ä»¥ç®åçç»ä»ä»¬åå«åéHEAD请æ±æ¥å¤ææ¯å¦åå¨æ»é¾ï¼è¿æ¯ä½¿ç¨GETè¦å¿«å¾å¤ã
äºãHTTP Headers ä¸ç HTTP请æ±
ç°å¨æ们æ¥çä¸äºå¨HTTP headersä¸å¸¸è§çHTTP请æ±ä¿¡æ¯ã
ææè¿äºå¤´é¨ä¿¡æ¯é½å¯ä»¥å¨PHPç
$_SERVER
æ°ç»ä¸æ¾å°ãä½ ä¹å¯ä»¥ç¨
getallheaders()
å½æ°ä¸æ¬¡æ§è·åææç头é¨ä¿¡æ¯ã
Host
ä¸ä¸ªHTTP请æ±ä¼åéè³ä¸ä¸ªç¹å®çIPå°åï¼ä½æ¯å¤§é¨åæå¡å¨é½æå¨åä¸IPå°åä¸æ管å¤ä¸ªç½ç«çè½åï¼é£ä¹æå¡å¨å¿ é¡»ç¥éæµè§å¨è¯·æ±çæ¯åªä¸ªååä¸çèµæºã
è¿åªæ¯åºæ¬ç主æºåï¼å å«åååå级ååã
å¨PHPä¸ï¼å¯ä»¥éè¿
$_SERVER['HTTP_HOST']
æ
$_SERVER['SERVER_NAME']
æ¥æ¥çã
User-Agent
è¿ä¸ªå¤´é¨å¯ä»¥æºå¸¦å¦ä¸å æ¡ä¿¡æ¯ï¼
- æµè§å¨ååçæ¬å·ï¼
- æä½ç³»ç»ååçæ¬å·ï¼
- é»è®¤è¯è¨ã
è¿å°±æ¯æäºç½ç«ç¨æ¥æ¶é访客信æ¯çä¸è¬æ段ãä¾å¦ï¼ä½ å¯ä»¥å¤æ访客æ¯å¦å¨ä½¿ç¨ææºè®¿é®ä½ çç½ç«ï¼ç¶åå³å®æ¯å¦å°ä»ä»¬å¼å¯¼è³ä¸ä¸ªå¨ä½å辨çä¸è¡¨ç°è¯å¥½ç移å¨ç½ç«ã
å¨PHPä¸ï¼å¯ä»¥éè¿
$_SERVER['HTTP_USER_AGENT']
æ¥è·åUser-Agent
if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {
echo "Please stop using IE6!";
}
Accept-Language
è¿ä¸ªä¿¡æ¯å¯ä»¥è¯´æç¨æ·çé»è®¤è¯è¨è®¾ç½®ãå¦æç½ç«æä¸åçè¯è¨çæ¬ï¼é£ä¹å°±å¯ä»¥éè¿è¿ä¸ªä¿¡æ¯æ¥éå®åç¨æ·çæµè§å¨ã
å®å¯ä»¥éè¿éå·åå²æ¥æºå¸¦å¤å½è¯è¨ã第ä¸ä¸ªä¼æ¯é¦éçè¯è¨ï¼å ¶å®è¯è¨ä¼æºå¸¦ä¸ä¸ªâqâå¼ï¼æ¥è¡¨ç¤ºç¨æ·å¯¹è¯¥è¯è¨çå好ç¨åº¦ï¼0~1ï¼ã
å¨PHPä¸ç¨
$_SERVER["HTTP_ACCEPT_LANGUAGE"]
æ¥è·åè¿ä¸ä¿¡æ¯ã
if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], , ) == 'fr') {
header('Location: http://french.mydomain.com');
}
Accept-Encoding
大é¨åçç°ä»£æµè§å¨é½æ¯ægzipå缩ï¼å¹¶ä¼æè¿ä¸ä¿¡æ¯æ¥åç»æå¡å¨ãè¿æ¶æå¡å¨å°±ä¼å缩è¿çHTMLåéç»æµè§å¨ãè¿å¯ä»¥åå°è¿80%çæ件大å°ï¼ä»¥èçä¸è½½æ¶é´å带宽ã
å¨PHPä¸å¯ä»¥ä½¿ç¨
$_SERVER["HTTP_ACCEPT_ENCODING"]
è·å该信æ¯ã ç¶åè°ç¨
ob_gzhandler()
æ¹æ³æ¶ä¼èªå¨æ£æµè¯¥å¼ï¼æä»¥ä½ æ éæå¨æ£æµã
// enables output buffering
// and all output is compressed if the browser supports it
ob_start('ob_gzhandler');
If-Modified-Since
å¦æä¸ä¸ªé¡µé¢å·²ç»å¨ä½ çæµè§å¨ä¸è¢«ç¼åï¼é£ä¹ä½ ä¸æ¬¡æµè§æ¶æµè§å¨å°ä¼æ£æµææ¡£æ¯å¦è¢«ä¿®æ¹è¿ï¼é£ä¹å®å°±ä¼åéè¿æ ·ç头é¨ï¼
å¦æèªä»è¿ä¸ªæ¶é´ä»¥æ¥æªè¢«ä¿®æ¹è¿ï¼é£ä¹æå¡å¨å°ä¼è¿å
â304 Not Modifiedâ
ï¼èä¸ä¸ä¼åè¿åå 容ãæµè§å¨å°èªå¨å»ç¼åä¸è¯»åå 容
å¨PHPä¸ï¼å¯ä»¥ç¨
$_SERVER['HTTP_IF_MODIFIED_SINCE']
æ¥æ£æµã
// assume $last_modify_time was the last the output was updated
// did the browser send If-Modified-Since header?
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
// if the browser cache matches the modify time
if ($last_modify_time == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
// send a 304 header, and no content
header("HTTP/1.1 304 Not Modified");
exit;
}
}
è¿æä¸ä¸ªå«EtagçHTTP头信æ¯ï¼å®è¢«ç¨æ¥ç¡®å®ç¼åçä¿¡æ¯æ¯å¦æ£ç¡®ï¼ç¨åæ们å°ä¼è§£éå®ã
Cookie
顾åæä¹ï¼ä»ä¼åéä½ æµè§å¨ä¸åå¨çCookieä¿¡æ¯ç»æå¡å¨ã
å®æ¯ç¨åå·åå²çä¸ç»åå¼å¯¹ãCookieä¹å¯ä»¥å å«session idã
å¨PHPä¸ï¼åä¸çCookieå¯ä»¥è®¿é®
$_COOKIE
æ°ç»è·å¾ãä½ å¯ä»¥ç´æ¥ç¨
$_SESSION array
è·åsessionåéãå¦æä½ éè¦session idï¼é£ä¹ä½ å¯ä»¥ä½¿ç¨
session_id()
å½æ°ä»£æ¿cookieã
echo $_COOKIE['foo'];
// output: bar
echo $_COOKIE['PHPSESSID'];
// output: r2t5uvjq435r4q7ib3vtdjq120
session_start();
echo session_id();
// output: r2t5uvjq435r4q7ib3vtdjq120
Referer
顾åæä¹, 头é¨å°ä¼å å«referring urlä¿¡æ¯ã
ä¾å¦ï¼æ访é®Nettuts+ç主页并ç¹å»äºä¸ä¸ªé¾æ¥ï¼è¿ä¸ªå¤´é¨ä¿¡æ¯å°ä¼åéå°æµè§å¨ï¼
å¨PHPä¸ï¼å¯ä»¥éè¿
$_SERVER['HTTP_REFERER']
è·å该å¼ã
if (isset($_SERVER['HTTP_REFERER'])) {
$url_info = parse_url($_SERVER['HTTP_REFERER']);
// is the surfer coming from Google?
if ($url_info['host'] == 'www.google.com') {
parse_str($url_info['query'], $vars);
echo "You searched on Google for this keyword: ". $vars['q'];
}
}
// if the referring url was:
// http://www.google.com/search?source=ig&hl=en&rlz=&=&q=http+headers&aq=f&oq=&aqi=g-p1g9
// the output will be:
// You searched on Google for this keyword: http headers
You may have noticed the word âreferrerâ is misspelled as ârefererâ. Unfortunately it made into the official HTTP specifications like that and got stuck.
ä¸ãHTTP Headers ä¸ç HTTPååº
ç°å¨è®©æäºè§£ä¸äºå¸¸è§çHTTP Headersä¸çHTTPååºä¿¡æ¯ã
å¨PHPä¸ï¼ä½ å¯ä»¥éè¿
header()
æ¥è®¾ç½®å¤´é¨ååºä¿¡æ¯ãPHPå·²ç»èªå¨åéäºä¸äºå¿ è¦ç头é¨ä¿¡æ¯ï¼å¦ è½½å ¥çå 容ï¼è®¾ç½® cookies ççâ¦ ä½ å¯ä»¥éè¿
headers_list()
å½æ°çå°å·²åéåå°è¦åéç头é¨ä¿¡æ¯ãä½ ä¹å¯ä»¥ä½¿ç¨
headers_sent()
å½æ°æ¥æ£æ¥å¤´é¨ä¿¡æ¯æ¯å¦å·²ç»è¢«åéã
Cache-Control
w3.org çå®ä¹æ¯ï¼âThe Cache-Control general-header field is used to specify directives which MUST be obeyed by all caching mechanisms along the request/response chain.â å ¶ä¸âcaching mechanismsâå å«ä¸äºä½ ISPå¯è½ä¼ç¨å°ç ç½å ³å代çä¿¡æ¯ã
ä¾å¦ï¼
âpublicâæå³çè¿ä¸ªååºå¯ä»¥è¢«ä»»ä½äººç¼åï¼âmax-ageâ å表æäºè¯¥ç¼åææçç§æ°ãå è®¸ä½ çç½ç«è¢«ç¼åé大大åå°ä¸è½½æ¶é´å带宽ï¼åæ¶ä¹æé«çæµè§å¨çè½½å ¥é度ã
ä¹å¯ä»¥éè¿è®¾ç½® âno-cacheâ æ令æ¥ç¦æ¢ç¼åï¼
æ´å¤è¯¦æ 请åè§w3.orgã
Content-Type
è¿ä¸ªå¤´é¨å å«äºææ¡£çâmime-typeâãæµè§å¨å°ä¼ä¾æ®è¯¥åæ°å³å®å¦ä½å¯¹ææ¡£è¿è¡è§£æãä¾å¦ï¼ä¸ä¸ªhtml页é¢ï¼æè æhtmlè¾åºçphp页é¢ï¼å°ä¼è¿åè¿æ ·çä¸è¥¿ï¼
Content-Type: text/html; charset=UTF-
âtextâ æ¯æ档类åï¼âhtmlâåæ¯ææ¡£åç±»åã è¿ä¸ªå¤´é¨è¿å æ¬äºæ´å¤ä¿¡æ¯ï¼ä¾å¦ charsetã
å¦ææ¯ä¸ä¸ªå¾çï¼å°ä¼åéè¿æ ·çååºï¼
æµè§å¨å¯ä»¥éè¿mime-typeæ¥å³å®ä½¿ç¨å¤é¨ç¨åºè¿æ¯èªèº«æ©å±æ¥æå¼è¯¥ææ¡£ãå¦ä¸çä¾åéè°ç¨Adobe Readerï¼
ç´æ¥è½½å ¥ï¼Apacheé常ä¼èªå¨å¤æææ¡£çmime-type并ä¸æ·»å åéçä¿¡æ¯å°å¤´é¨å»ã并ä¸å¤§é¨åæµè§å¨é½æä¸å®ç¨åº¦ç容éï¼å¨å¤´é¨æªæä¾æè é误æä¾è¯¥ä¿¡æ¯çæ åµä¸å®ä¼å»èªå¨æ£æµmime-typeã
ä½ å¯ä»¥å¨è¿éæ¾å°ä¸ä¸ªå¸¸ç¨mime-typeå表ã
å¨PHPä¸ä½ å¯ä»¥éè¿
finfo_file()
æ¥æ£æµæ件çime-typeã
Content-Disposition
è¿ä¸ªå¤´é¨ä¿¡æ¯å°åè¯æµè§å¨æå¼ä¸ä¸ªæ件ä¸è½½çªå£ï¼èä¸æ¯è¯å¾è§£æ该ååºçå 容ãä¾å¦ï¼
ä»ä¼å¯¼è´æµè§å¨åºç°å¯¹è¯æ¡ã
注æï¼éåå®çContent-Type头信æ¯åæ¶ä¹ä¼è¢«åé
Content-Type: application/zip
Content-Disposition: attachment; filename="download.zip"
Content-Length
å½å 容å°è¦è¢«ä¼ è¾å°æµè§å¨æ¶ï¼æå¡å¨å¯ä»¥éè¿è¯¥å¤´é¨åç¥æµè§å¨å°è¦ä¼ éæ件ç大å°ï¼bytesï¼ã
对äºæ件ä¸è½½æ¥è¯´è¿ä¸ªä¿¡æ¯ç¸å½çæç¨ãè¿å°±æ¯ä¸ºä»ä¹æµè§å¨ç¥éä¸è½½è¿åº¦çåå ã
ä¾å¦ï¼è¿éæåäºä¸æ®µèæèæ¬ï¼æ¥æ¨¡æä¸ä¸ªæ ¢éä¸è½½ã
// it's a zip file
header('Content-Type: application/zip');
// 1 million bytes (about 1megabyte)
header('Content-Length: 1000000');
// load a download dialogue, and save it as download.zip
header('Content-Disposition: attachment; filename="download.zip"');
// 1000 times 1000 bytes of data
for ($i = ; $i < ; $i++) {
echo str_repeat(".",);
// sleep to slow down the download
usleep();
}
ç°å¨ï¼æå°Content-Length头é¨æ³¨éæï¼
// it's a zip file
header('Content-Type: application/zip');
// the browser won't know the size
// header('Content-Length: 1000000');
// load a download dialogue, and save it as download.zip
header('Content-Disposition: attachment; filename="download.zip"');
// 1000 times 1000 bytes of data
for ($i = 0; $i < 1000; $i++) {
echo str_repeat(".",1000);
// sleep to slow down the download
usleep(50000);
}
Etag
è¿æ¯å¦ä¸ä¸ªä¸ºç¼åè产çç头é¨ä¿¡æ¯ãå®çèµ·æ¥ä¼æ¯è¿æ ·ï¼
æå¡å¨å¯è½ä¼å°è¯¥ä¿¡æ¯åæ¯ä¸ªè¢«åéæ件ä¸èµ·ååºç»æµè§å¨ã该å¼å¯ä»¥å å«ææ¡£çæåä¿®æ¹æ¥æï¼æ件大å°æè æä»¶æ ¡éªåãæµè§ä¼æå®åææ¥æ¶å°çææ¡£ä¸èµ·ç¼åãä¸ä¸æ¬¡å½æµè§å¨å次请æ±åä¸æ件æ¶å°ä¼åéå¦ä¸çHTTP请æ±ï¼
å¦ææ请æ±çææ¡£Etagå¼åå®ä¸è´ï¼æå¡å¨å°ä¼åé304ç¶æç ï¼èä¸æ¯2ooã并ä¸ä¸è¿åå 容ãæµè§å¨æ¤æ¶å°±ä¼ä»ç¼åå 载该æ件ã
Last-Modified
顾åæä¹ï¼è¿ä¸ªå¤´é¨ä¿¡æ¯ç¨GMTæ ¼å¼è¡¨æäºææ¡£çæåä¿®æ¹æ¶é´ï¼
$modify_time = filemtime($file);
header("Last-Modified: " . gmdate("D, d M Y H:i:s", $modify_time) . " GMT");
å®æä¾äºå¦ä¸ç§ç¼åæºå¶ãæµè§å¨å¯è½ä¼åéè¿æ ·ç请æ±ï¼
å¨If-Modified-Sinceä¸èæ们已ç»è®¨è®ºè¿äºã
Location
è¿ä¸ªå¤´é¨æ¯ç¨æ¥éå®åçãå¦æååºä»£ç 为 301 æè 302 ï¼æå¡å¨å°±å¿ é¡»åé该头é¨ãä¾å¦ï¼å½ä½ è®¿é® http://www.nettuts.com æ¶æµè§å¨å°±ä¼æ¶å°å¦ä¸çååºï¼
HTTP/1.x Moved Permanently
...
Location: http://net.tutsplus.com/
...
å¨PHPä¸ä½ å¯ä»¥éè¿è¿ç§æ¹å¼å¯¹è®¿å®¢éå®åï¼
header('Location: http://net.tutsplus.com/');
é»è®¤ä¼åé302ç¶æç ï¼å¦æä½ æ³åé301ï¼å°±è¿æ ·åï¼
header('Location: http://net.tutsplus.com/', true, );
å½ä¸ä¸ªç½ç«éè¦è®¾ç½®æè æ´æ°ä½ æµè§çcookieä¿¡æ¯æ¶ï¼å®å°±ä¼ä½¿ç¨è¿æ ·ç头é¨ï¼
Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT
Set-Cookie: session-id=120-7333518-8165026; path=/; domain=.amazon.com; expires=Sat Feb 27 08:00:00 2010 GMT
æ¯ä¸ªcookieä¼ä½ä¸ºåç¬çä¸æ¡å¤´é¨ä¿¡æ¯ã注æï¼éè¿js设置cookieå°ä¸ä¼ä½ç°å¨HTTP头ä¸ã
å¨PHPä¸ï¼ä½ å¯ä»¥éè¿setcookie()å½æ°æ¥è®¾ç½®cookieï¼PHPä¼åéåéçHTTP 头ã
setcookie("TestCookie", "foobar");
å®ä¼åéè¿æ ·ç头信æ¯ï¼
å¦ææªæå®å°ææ¶é´ï¼cookieå°±ä¼å¨æµè§å¨å ³éå被å é¤ã
WWW-Authenticate
ä¸ä¸ªç½ç«å¯è½ä¼éè¿HTTPåéè¿ä¸ªå¤´é¨ä¿¡æ¯æ¥éªè¯ç¨æ·ãå½æµè§å¨çå°å¤´é¨æè¿ä¸ªååºæ¶å°±ä¼æå¼ä¸ä¸ªå¼¹åºçªã
Content-Encoding
è¿ä¸ªå¤´é¨é常ä¼å¨è¿åå 容被å缩æ¶è®¾ç½®ã
转载å°åï¼
http://hi.baidu.com/%CE%E2_%F0%A9/blog/item/ab29c5e844e63e33b90e2d4a.html