HTTP เขียนโดย Hypertext Transfer Protocol เวิลด์ไวด์เว็บทั้งหมดใช้โปรโตคอลนี้ เนื้อหาส่วนใหญ่ที่คุณเห็นในเบราว์เซอร์ของคุณจะถูกส่งผ่านโปรโตคอล HTTP เช่นบทความนี้
ส่วนหัว HTTP เป็นคำขอ HTTP และแกนที่เกี่ยวข้องและมีข้อมูลเกี่ยวกับเบราว์เซอร์ไคลเอนต์หน้าคำขอเซิร์ฟเวอร์ ฯลฯ
เมื่อคุณพิมพ์ URL ในแถบที่อยู่เบราว์เซอร์เบราว์เซอร์ของคุณจะคล้ายกับคำขอ HTTP ต่อไปนี้:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
โฮสต์: net.tutsplus.com
ผู้ใช้ตัวแทน: 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)
ยอมรับ: ข้อความ/html, แอปพลิเคชัน/xhtml+xml, แอปพลิเคชัน/xml; q = 0.9,*/*; q = 0.8
ยอมรับภาษา: en-us, en; q = 0.5
ยอมรับการเข้ารหัส: gzip, deflate
Accept-Charset: ISO-8859-1, UTF-8; q = 0.7,*; q = 0.7
Keep-Alive: 300
การเชื่อมต่อ: Keep-Alive
คุกกี้: phpsessid = r2t5uvjq435r4q7ib3vtdjq120
Pragma: ไม่มีแคช
แคชควบคุม: ไม่มีแคช
บรรทัดแรกเรียกว่าสายคำขอ มันอธิบายข้อมูลพื้นฐานของคำขอนี้และส่วนที่เหลือคือส่วนหัว HTTP
หลังจากคำขอเสร็จสิ้นเบราว์เซอร์ของคุณอาจได้รับการตอบกลับ HTTP ต่อไปนี้:
HTTP/1.x 200 OK
การเข้ารหัสการถ่ายโอน: chunked
วันที่: วันเสาร์ที่ 28 พ.ย. 2552 04:36:25 GMT
เซิร์ฟเวอร์: litespeed
การเชื่อมต่อ: ปิด
X-powered-by: W3 Total Cache/0.8
Pragma: สาธารณะ
หมดอายุ: SAT, 28 พ.ย. 2552 05:36:25 GMT
etag: PUB1259380237; GZ
Cache-Control: Max-age = 3600, สาธารณะ
ประเภทเนื้อหา: ข้อความ/html; charset = utf-8
ล่าสุดแก้ไข: วันเสาร์, 28 พ.ย. 2552 03:50:37 GMT
X-Pingback: http://net.tutsplus.com/xmlrpc.php
การเข้ารหัสเนื้อหา: GZIP
แตกต่างกัน: ยอมรับการเข้ารหัส, คุกกี้, ตัวแทนผู้ใช้
<!-... ส่วนที่เหลือของ html ...->
บรรทัดแรกเรียกว่าบรรทัดสถานะซึ่งตามด้วยส่วนหัว HTTP หลังจากที่เส้นเปล่าเสร็จสิ้นเนื้อหาจะถูกส่งออก (ในกรณีนี้เอาต์พุต HTML บางอย่าง)
แต่คุณไม่เห็นส่วนหัว HTTP เมื่อคุณดูซอร์สโค้ดของหน้าแม้ว่าจะถูกส่งไปยังเบราว์เซอร์พร้อมกับสิ่งที่คุณเห็น
คำขอ HTTP นี้ยังส่งคำขอบางอย่างสำหรับการรับทรัพยากรอื่น ๆ เช่นรูปภาพไฟล์ CSS ไฟล์ JS ฯลฯ
มาดูรายละเอียดด้านล่าง
ส่วนขยาย Firefox ต่อไปนี้สามารถช่วยคุณวิเคราะห์ส่วนหัว HTTP:
1. Firebug
2. ส่วนหัว http live
3. ใน PHP:
ด้านล่างบทความคุณจะเห็นตัวอย่างของการใช้การสาธิต PHP
บรรทัดแรกที่เรียกว่าบรรทัดแรกมีสามส่วน:
ส่วนที่เหลือคือแต่ละบรรทัดที่มีชื่อ: คู่ค่า พวกเขามีข้อมูลที่หลากหลายเกี่ยวกับคำขอและเบราว์เซอร์ของคุณ ตัวอย่างเช่นตัวแทนผู้ใช้ระบุเวอร์ชันเบราว์เซอร์ของคุณและระบบปฏิบัติการที่คุณใช้ การรับการเข้ารหัสจะบอกเซิร์ฟเวอร์ว่าการท่องเว็บของคุณสามารถรับเอาต์พุตที่ถูกบีบอัดได้คล้ายกับ GZIP
ส่วนหัวเหล่านี้ส่วนใหญ่เป็นตัวเลือก คำขอ HTTP สามารถลดลงได้:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
โฮสต์: net.tutsplus.com
และคุณยังสามารถรับการตอบกลับที่ถูกต้องจากเซิร์ฟเวอร์
คำขอสามประเภทที่พบบ่อยที่สุดคือ: รับโพสต์และหัว คุณอาจคุ้นเคยกับสองคนแรกในระหว่างกระบวนการเขียนของ HTML
ส่วนใหญ่ของ HTML, Images, JS, CSS, ... ที่ส่งไปยังเบราว์เซอร์จะถูกร้องขอผ่านวิธี GET มันเป็นวิธีหลักในการรับข้อมูล
ตัวอย่างเช่นในการรับบทความ Nettus+ บรรทัดแรกของคำขอ HTTP มักจะมีลักษณะเช่นนี้:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
เมื่อโหลด HTML แล้วเบราว์เซอร์จะส่งคำขอ GET เพื่อรับภาพเช่นนี้:
GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP/1.1
แบบฟอร์มสามารถส่งผ่านวิธี GET นี่คือตัวอย่าง:
<form action=foo.php method=GET>
ชื่อแรก: <ชื่ออินพุต = first_name type = text />
นามสกุล: <ชื่ออินพุต = last_name type = text />
<ชื่ออินพุต = ประเภทการกระทำ = ส่งค่า = ส่ง />
</form>
เมื่อส่งแบบฟอร์มนี้คำขอ HTTP จะมีลักษณะเช่นนี้:
GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1
-
คุณสามารถส่งฟอร์มอินพุตไปยังเซิร์ฟเวอร์โดยผนวกเข้ากับสตริงแบบสอบถาม
แม้ว่าคุณจะสามารถแนบข้อมูลกับ URL ผ่านวิธี GET เพื่อส่งผ่านไปยังเซิร์ฟเวอร์ แต่ก็เหมาะสมกว่าที่จะใช้โพสต์เพื่อส่งข้อมูลไปยังเซิร์ฟเวอร์ในหลายกรณี มันไม่สมจริงที่จะส่งข้อมูลจำนวนมากผ่าน Get และมีข้อ จำกัด บางประการ
เป็นเรื่องปกติที่จะใช้คำขอโพสต์เพื่อส่งข้อมูลแบบฟอร์ม ลองเปลี่ยนตัวอย่างข้างต้นเพื่อใช้โพสต์:
<form action=foo.php method=POST>
ชื่อแรก: <ชื่ออินพุต = first_name type = text />
นามสกุล: <ชื่ออินพุต = last_name type = text />
<ชื่ออินพุต = ประเภทการกระทำ = ส่งค่า = ส่ง />
</form>
การส่งแบบฟอร์มนี้จะสร้างคำขอ HTTP ดังนี้:
POST /foo.php HTTP/1.1
โฮสต์: localhost
ผู้ใช้ตัวแทน: 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)
ยอมรับ: ข้อความ/html, แอปพลิเคชัน/xhtml+xml, แอปพลิเคชัน/xml; q = 0.9,*/*; q = 0.8
ยอมรับภาษา: en-us, en; q = 0.5
ยอมรับการเข้ารหัส: gzip, deflate
Accept-Charset: ISO-8859-1, UTF-8; q = 0.7,*; q = 0.7
Keep-Alive: 300
การเชื่อมต่อ: Keep-Alive
ผู้อ้างอิง: http: //localhost/test.php
ประเภทเนื้อหา: แอปพลิเคชัน/x-www-form-urlencoded
ความยาวเนื้อหา: 43
first_name = john & last_name = doe & action = ส่ง
นี่คือสามสิ่งที่ควรทราบ:
การร้องขอวิธีการโพสต์สามารถใช้กับ AJAX, แอปพลิเคชัน, Curl …. และแบบฟอร์มการอัปโหลดไฟล์ทั้งหมดจะต้องใช้โพสต์
หัวและรับมีความคล้ายคลึงกันมากยกเว้นว่าหัวนั้นไม่ยอมรับส่วนเนื้อหาของการตอบกลับ HTTP เมื่อคุณส่งคำขอส่วนหัวนั่นหมายความว่าคุณสนใจเฉพาะส่วนหัว HTTP ไม่ใช่เอกสารของตัวเอง
วิธีนี้ช่วยให้เบราว์เซอร์สามารถตรวจสอบได้ว่าหน้านั้นได้รับการแก้ไขและควบคุมแคช นอกจากนี้ยังสามารถพิจารณาได้ว่ามีเอกสารที่ร้องขอหรือไม่
ตัวอย่างเช่นหากคุณมีลิงก์จำนวนมากในเว็บไซต์ของคุณคุณสามารถส่งคำขอส่วนหัวแยกต่างหากเพื่อพิจารณาว่ามีลิงก์ที่ตายแล้วซึ่งเร็วกว่าการใช้ Get มาก
เมื่อเบราว์เซอร์ส่งคำขอ HTTP เซิร์ฟเวอร์จะตอบสนองต่อคำขอผ่านการตอบกลับ HTTP หากคุณไม่สนใจเนื้อหาคำขอจะมีลักษณะเช่นนี้:
ข้อมูลที่มีค่าแรกคือข้อตกลง ปัจจุบันเซิร์ฟเวอร์จะใช้ http/1.x หรือ http/1.1
ถัดไปข้อความสั้น ๆ แสดงถึงสถานะ รหัส 200 หมายความว่าคำขอของเราถูกส่งเรียบร้อยแล้วและเซิร์ฟเวอร์จะส่งคืนเอกสารที่ร้องขอหลังจากข้อมูลส่วนหัว
เราทุกคนเห็นหน้า 404 เมื่อฉันขอพา ธ ที่ไม่มีอยู่จากเซิร์ฟเวอร์เซิร์ฟเวอร์ตอบกลับเราด้วย 404 แทน 200
ส่วนที่เหลือของการตอบกลับคล้ายกับคำขอ HTTP นี่เป็นเรื่องเกี่ยวกับซอฟต์แวร์เซิร์ฟเวอร์เมื่อมีการแก้ไขหน้า/ไฟล์ประเภท MIME ฯลฯ ...
ในทำนองเดียวกันข้อมูลส่วนหัวเหล่านี้เป็นทางเลือก
ดังที่ได้กล่าวไว้ข้างต้น 200 ใช้เพื่อระบุว่าคำขอนั้นสำเร็จ
206 เนื้อหาบางส่วนหากแอปพลิเคชันร้องขอไฟล์ภายในช่วงที่กำหนดเท่านั้นจะส่งคืน 206
โดยปกติแล้วจะใช้สำหรับการจัดการดาวน์โหลด, เบรกพอยต์ต่อเนื่องหรือการดาวน์โหลด chunking ไฟล์
ไม่พบ 404เข้าใจง่าย
401 โดยไม่ได้รับอนุญาตหน้ารหัสผ่านที่ได้รับการป้องกันจะกลับไปที่สถานะนี้ หากคุณไม่ป้อนรหัสผ่านที่ถูกต้องคุณจะเห็นข้อมูลต่อไปนี้ในเบราว์เซอร์ของคุณ:
โปรดทราบว่านี่เป็นเพียงหน้าป้องกันรหัสผ่าน กล่องป๊อปอัพที่ร้องขอให้ป้อนรหัสผ่านเป็นแบบนี้:
403 ต้องห้ามหากคุณไม่ได้รับอนุญาตให้เข้าถึงหน้าเว็บมันจะกลับไปที่สถานะ 403 สิ่งนี้มักจะเกิดขึ้นเมื่อคุณพยายามเปิดโฟลเดอร์โดยไม่มีหน้าดัชนี หากการตั้งค่าเซิร์ฟเวอร์ไม่อนุญาตให้ดูเนื้อหาไดเรกทอรีคุณจะเห็นข้อผิดพลาด 403
วิธีการอื่น ๆ ยังส่งข้อ จำกัด การอนุญาตเช่นคุณสามารถบล็อกผ่านที่อยู่ IP ของคุณซึ่งต้องการความช่วยเหลือ HTaccess
order allow,deny
ปฏิเสธจาก 192.168.44.201
ปฏิเสธจาก 224.39.163.12
ปฏิเสธจาก 172.16.7.92
อนุญาตจากทั้งหมด
302 (หรือ 307) ย้ายชั่วคราวและ 301 ย้ายอย่างถาวรทั้งสองรัฐจะปรากฏขึ้นเมื่อเบราว์เซอร์เปลี่ยนเส้นทาง ตัวอย่างเช่นคุณใช้บริการลดระดับ URL เช่น bit.ly นี่คือวิธีที่พวกเขารู้ว่าใครคลิกที่ลิงค์ของพวกเขา
302 และ 301 คล้ายกับเบราว์เซอร์มาก แต่มีความแตกต่างบางประการสำหรับซอฟต์แวร์รวบรวมข้อมูลของเครื่องมือค้นหา ตัวอย่างเช่นหากเว็บไซต์ของคุณได้รับการดูแลรักษาคุณจะเปลี่ยนเส้นทางเบราว์เซอร์ไคลเอนต์ไปยังที่อยู่อื่นด้วย 302 เครื่องรวบรวมข้อมูลเครื่องมือค้นหาจะทำการจัดอันดับหน้าของคุณอีกครั้งในอนาคต แต่ถ้าคุณใช้การเปลี่ยนเส้นทาง 301 หมายความว่าคุณบอกเครื่องมือค้นหาเครื่องมือค้นหา: เว็บไซต์ของคุณถูกย้ายไปยังที่อยู่ใหม่อย่างถาวร
ข้อผิดพลาดของเซิร์ฟเวอร์ 500 (ข้อผิดพลาดของเซิร์ฟเวอร์ภายใน)รหัสนี้มักจะปรากฏขึ้นเมื่อสคริปต์หน้าล่ม สคริปต์ CGI ส่วนใหญ่ไม่ได้ส่งข้อความแสดงข้อผิดพลาดไปยังเบราว์เซอร์เช่น PHP หากเกิดข้อผิดพลาดร้ายแรงพวกเขาจะส่งรหัสสถานะ 500 ในเวลานี้คุณต้องตรวจสอบบันทึกข้อผิดพลาดของเซิร์ฟเวอร์เพื่อแก้ไขปัญหา
รายการที่สมบูรณ์คุณสามารถค้นหาคำอธิบายรหัสสถานะ HTTP แบบเต็มได้ที่นี่ หรือตรวจสอบที่นี่ (http://tools.vevb.com/table/http_status_code)
ทีนี้มาดูข้อมูลคำขอ HTTP ทั่วไปในส่วนหัว HTTP
ข้อมูลส่วนหัวทั้งหมดนี้สามารถพบได้ในอาร์เรย์ $ _Server ของ PHP นอกจากนี้คุณยังสามารถใช้ฟังก์ชั่น GetAllheaders () เพื่อรับข้อมูลส่วนหัวทั้งหมดในครั้งเดียว
คำขอ HTTP จะถูกส่งไปยังที่อยู่ IP เฉพาะ แต่เซิร์ฟเวอร์ส่วนใหญ่มีความสามารถในการโฮสต์หลายเว็บไซต์ภายใต้ที่อยู่ IP เดียวกันดังนั้นเซิร์ฟเวอร์จะต้องรู้ว่าชื่อโดเมนใดที่เบราว์เซอร์ร้องขอ
Host: rlog.cn
นี่เป็นเพียงชื่อโฮสต์พื้นฐานรวมถึงชื่อโดเมนและชื่อโดเมนเด็ก
ใน PHP คุณสามารถดูได้ผ่าน $ _server ['http_host'] หรือ $ _server ['server_name']
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)
หัวนี้สามารถนำข้อมูลต่อไปนี้:
นี่คือวิธีการทั่วไปที่ใช้โดยบางเว็บไซต์เพื่อรวบรวมข้อมูลผู้เข้าชม ตัวอย่างเช่นคุณสามารถบอกได้ว่าผู้เข้าชมใช้โทรศัพท์ของคุณเพื่อเยี่ยมชมเว็บไซต์ของคุณแล้วตัดสินใจว่าจะนำพวกเขาไปยังเว็บไซต์มือถือที่ทำงานได้ดีด้วยความละเอียดต่ำหรือไม่
ใน PHP สามารถรับตัวแทนผู้ใช้ได้ผ่าน $ _Server ['http_user_agent']
if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {
echo โปรดหยุดใช้ IE6!;
-
Accept-Language: en-us,en;q=0.5
ข้อมูลนี้สามารถระบุการตั้งค่าภาษาเริ่มต้นของผู้ใช้ หากเว็บไซต์มีเวอร์ชันภาษาอื่นคุณสามารถใช้ข้อมูลนี้เพื่อเปลี่ยนเส้นทางเบราว์เซอร์ของผู้ใช้
มันสามารถดำเนินการในหลายภาษาโดยการแบ่งส่วนเครื่องหมายจุลภาค ภาษาแรกจะเป็นภาษาที่ต้องการและภาษาอื่น ๆ จะมีค่า Q เพื่อระบุการตั้งค่าของผู้ใช้สำหรับภาษา (0 ~ 1)
ใช้ $ _Server [http_accept_language] ใน PHP เพื่อรับข้อมูลนี้
if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') {
ส่วนหัว ('สถานที่: http://french.mydomain.com');
-
Accept-Encoding: gzip,deflate
เบราว์เซอร์ที่ทันสมัยส่วนใหญ่รองรับการบีบอัด GZIP และจะรายงานข้อมูลนี้ไปยังเซิร์ฟเวอร์ ในเวลานี้ HTML ที่บีบอัดจะถูกส่งไปยังเบราว์เซอร์ สิ่งนี้สามารถลดขนาดไฟล์ได้เกือบ 80% เพื่อประหยัดเวลาดาวน์โหลดและแบนด์วิดท์
ข้อมูลนี้สามารถรับได้โดยใช้ $ _Server [http_accept_encoding] ใน PHP จากนั้นค่าจะถูกตรวจพบโดยอัตโนมัติเมื่อมีการเรียกใช้วิธี OB_GZHANDLER () ดังนั้นคุณไม่จำเป็นต้องตรวจจับด้วยตนเอง
// enables output buffering
// และเอาต์พุตทั้งหมดจะถูกบีบอัดหากเบราว์เซอร์รองรับ
ob_start ('ob_gzhandler');
หากหน้าหนึ่งถูกแคชในเบราว์เซอร์ของคุณในครั้งต่อไปที่คุณเรียกดูเบราว์เซอร์จะตรวจสอบว่าเอกสารได้รับการแก้ไขหรือไม่และมันจะส่งส่วนหัวเช่นนี้:
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
หากยังไม่ได้รับการแก้ไขตั้งแต่เวลานี้เซิร์ฟเวอร์จะส่งคืน 304 ไม่ได้รับการแก้ไขและจะไม่ส่งคืนเนื้อหา เบราว์เซอร์จะอ่านเนื้อหาโดยอัตโนมัติในแคช
ใน PHP คุณสามารถใช้ $ _server ['http_if_modified_since'] เพื่อตรวจจับ
// assume $last_modify_time was the last the output was updated
// เบราว์เซอร์ส่งส่วนหัว if-modified-snate หรือไม่?
if (isset ($ _ เซิร์ฟเวอร์ ['http_if_modified_since'])) {
// ถ้าแคชเบราว์เซอร์ตรงกับเวลาที่แก้ไข
if ($ last_modify_time == strtotime ($ _ เซิร์ฟเวอร์ ['http_if_modified_since'])) {
// ส่งส่วนหัว 304 และไม่มีเนื้อหา
ส่วนหัว (HTTP/1.1 304 ไม่ได้แก้ไข);
ออก;
-
-
นอกจากนี้ยังมีส่วนหัว HTTP ที่เรียกว่า ETAG ซึ่งใช้เพื่อตรวจสอบว่าข้อมูลแคชนั้นถูกต้องหรือไม่และเราจะอธิบายในภายหลัง
ตามชื่อหมายถึงมันจะส่งข้อมูลคุกกี้ที่เก็บไว้ในเบราว์เซอร์ของคุณไปยังเซิร์ฟเวอร์
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar
มันเป็นชุดของคู่ที่มีชื่อหารด้วยเครื่องหมายอัฒภาค คุกกี้ยังสามารถรวมรหัสเซสชัน
ใน PHP สามารถรับคุกกี้เดียวได้โดยการเข้าถึงอาร์เรย์ $ _Cookie คุณสามารถใช้อาร์เรย์ $ _session โดยตรงเพื่อรับตัวแปรเซสชัน หากคุณต้องการรหัสเซสชันคุณสามารถใช้ฟังก์ชัน session_id () แทนคุกกี้
echo $_COOKIE['foo'];
// เอาท์พุท: บาร์
echo $ _cookie ['phpsessid'];
// เอาต์พุต: R2T5UVJQ435R4Q7IB3VTDJQ120
session_start ();
echo session_id ();
// เอาต์พุต: R2T5UVJQ435R4Q7IB3VTDJQ120
ตามชื่อหมายถึงส่วนหัวจะมีข้อมูล URL ที่อ้างอิง
ตัวอย่างเช่นฉันไปที่หน้าแรกของ Nettus+ และคลิกที่ลิงค์และส่วนหัวนี้จะถูกส่งไปยังเบราว์เซอร์:
Referer: http://net.tutsplus.com/
ใน PHP ค่าสามารถรับได้โดย $ _Server ['http_referer']
if (isset($_SERVER['HTTP_REFERER'])) {
$ url_info = parse_url ($ _ เซิร์ฟเวอร์ ['http_referer']);
// นักท่องมาจาก Google หรือไม่?
if ($ url_info ['host'] == 'www.google.com') {
parse_str ($ url_info ['Query'], $ vars);
Echo คุณค้นหาบน Google สำหรับคำหลักนี้: $ vars ['Q'];
-
-
// ถ้า URL อ้างอิงคือ:
// http://www.google.com/search?source=ig&hl=en&rlz=&=&q=http+headers&aq=f&oq=&aqi=g-p1g9
// ผลลัพธ์จะเป็น:
// คุณค้นหาบน Google สำหรับคำหลักนี้: HTTP Headers
คุณอาจสังเกตเห็นคำว่าผู้อ้างอิงถูกสะกดผิดว่าเป็นผู้อ้างอิง น่าเสียดายที่มันเป็นข้อกำหนด HTTP อย่างเป็นทางการเช่นนั้นและติดอยู่
เมื่อหน้าต้องได้รับอนุญาตเบราว์เซอร์จะปรากฏขึ้นในหน้าต่างเข้าสู่ระบบ หลังจากป้อนบัญชีที่ถูกต้องเบราว์เซอร์จะส่งคำขอ HTTP แต่จะมีส่วนหัว:
Authorization: Basic bXl1c2VyOm15cGFzcw==
ส่วนนี้ของข้อมูลที่มีอยู่ในส่วนหัวคือการเข้ารหัส Base64 ตัวอย่างเช่น base64_decode ('bxl1c2vyom15cgfzcw ==') จะถูกแปลงเป็น 'myuser: mypass'
ใน PHP ค่านี้สามารถรับได้ด้วย $ _server ['php_auth_user'] และ $ _server ['php_auth_pw']
เราจะอธิบายรายละเอียดเพิ่มเติมในส่วน www-authenticate
ตอนนี้ให้ฉันเข้าใจข้อมูลการตอบกลับ HTTP ในส่วนหัว HTTP ทั่วไป
ใน PHP คุณสามารถตั้งค่าข้อมูลการตอบกลับส่วนหัวผ่านส่วนหัว () PHP ได้ส่งข้อมูลส่วนหัวที่จำเป็นบางอย่างโดยอัตโนมัติเช่นเนื้อหาที่โหลดการตั้งค่าคุกกี้ ฯลฯ ... คุณสามารถเห็นการส่งและส่งผ่านฟังก์ชั่น Headers_list () นอกจากนี้คุณยังสามารถใช้ฟังก์ชั่น Headers_sent () เพื่อตรวจสอบว่ามีการส่งข้อมูลส่วนหัวหรือไม่
W3.org ถูกกำหนดเป็น: ฟิลด์การควบคุมแคชทั่วไปใช้เพื่อระบุคำสั่งที่จะต้องปฏิบัติตามกลไกการแคชทั้งหมดตามห่วงโซ่คำขอ/ตอบสนอง ในกรณีที่กลไกการแคชมีเกตเวย์และข้อมูลพร็อกซีบางอย่างที่ ISP ของคุณอาจใช้
ตัวอย่างเช่น:
Cache-Control: max-age=3600, public
สาธารณะหมายความว่าการตอบสนองสามารถแคชโดยทุกคนและอายุสูงสุดระบุจำนวนวินาทีที่แคชนั้นถูกต้อง ช่วยให้เว็บไซต์ของคุณถูกแคชเพื่อลดเวลาดาวน์โหลดและแบนด์วิดท์อย่างมากในขณะเดียวกันก็ปรับปรุงความเร็วในการโหลดเบราว์เซอร์
นอกจากนี้คุณยังสามารถปิดใช้งานแคชได้โดยการตั้งค่าคำสั่ง NO-CACHE:
Cache-Control: no-cache
สำหรับรายละเอียดเพิ่มเติมโปรดดู W3.org
ส่วนหัวนี้มีประเภท MIME ของเอกสาร เบราว์เซอร์จะตัดสินใจว่าจะแยกวิเคราะห์เอกสารตามพารามิเตอร์นี้ได้อย่างไร ตัวอย่างเช่นหน้า HTML (หรือหน้า PHP ที่มีเอาต์พุต HTML) จะส่งคืนสิ่งนี้:
Content-Type: text/html; charset=UTF-8
'ข้อความ' เป็นประเภทเอกสารและ 'HTML' เป็นประเภทย่อยของเอกสาร ส่วนหัวนี้ยังมีข้อมูลเพิ่มเติมเช่น Charset
หากเป็นภาพการตอบกลับเช่นนี้จะถูกส่ง:
Content-Type: image/gif
เบราว์เซอร์สามารถใช้ประเภท MIME เพื่อตัดสินใจว่าจะใช้โปรแกรมภายนอกหรือขยายเอกสารเอง ตัวอย่างต่อไปนี้ช่วยลดการโทรไปยัง Adobe Reader:
Content-Type: application/pdf
โหลดโดยตรง Apache มักจะตัดสินประเภท MIME โดยอัตโนมัติของเอกสารและเพิ่มข้อมูลที่เหมาะสมให้กับส่วนหัว นอกจากนี้เบราว์เซอร์ส่วนใหญ่มีระดับความทนทานต่อความผิดพลาดในระดับหนึ่ง หากส่วนหัวไม่ได้ให้หรือให้ข้อมูลไม่ถูกต้องจะตรวจจับประเภท MIME โดยอัตโนมัติ
คุณสามารถค้นหารายการประเภท MIME ที่ใช้กันทั่วไปได้ที่นี่
ใน PHP คุณสามารถใช้ FINFO_FILE () เพื่อตรวจจับประเภท IME ของไฟล์
ส่วนหัวนี้จะบอกให้เบราว์เซอร์เปิดหน้าต่างดาวน์โหลดไฟล์แทนที่จะพยายามแยกวิเคราะห์เนื้อหาของการตอบกลับ ตัวอย่างเช่น:
Content-Disposition: attachment; filename=download.zip
มันทำให้เบราว์เซอร์มีกล่องโต้ตอบเช่นนี้:
โปรดทราบว่าข้อมูลส่วนหัวประเภทเนื้อหาที่เหมาะสมจะถูกส่งด้วย
Content-Type: application/zip
เนื้อหาการกระจาย: เอกสารแนบ; filename = download.zip
เมื่อเนื้อหาจะถูกโอนไปยังเบราว์เซอร์เซิร์ฟเวอร์สามารถใช้ส่วนหัวนี้เพื่อแจ้งเบราว์เซอร์ของขนาด (ไบต์) ของไฟล์ที่จะถ่ายโอน
Content-Length: 89123
ข้อมูลนี้ค่อนข้างมีประโยชน์สำหรับการดาวน์โหลดไฟล์ นี่คือเหตุผลที่เบราว์เซอร์รู้ถึงความคืบหน้าของการดาวน์โหลด
ตัวอย่างเช่นที่นี่ฉันเขียนสคริปต์เสมือนจริงเพื่อจำลองการดาวน์โหลดช้า
// it's a zip file
ส่วนหัว ('เนื้อหาประเภท: แอปพลิเคชัน/zip');
// 1 ล้านไบต์ (ประมาณ 1megabyte)
ส่วนหัว ('ความยาวเนื้อหา: 100000');
// โหลดกล่องโต้ตอบดาวน์โหลดและบันทึกเป็น download.zip
ส่วนหัว ('เนื้อหา-การจัดสรร: ไฟล์แนบ; filename = download.zip');
// 1,000 ครั้ง 1,000 ไบต์ของข้อมูล
สำหรับ ($ i = 0; $ i <1,000; $ i ++) {
echo str_repeat (., 1,000);
// sleep เพื่อชะลอการดาวน์โหลด
USLEEP (50000);
-
ผลลัพธ์จะเป็นเช่นนี้:
ตอนนี้ฉันแสดงความคิดเห็นส่วนหัวความยาวเนื้อหา:
// it's a zip file
ส่วนหัว ('เนื้อหาประเภท: แอปพลิเคชัน/zip');
// เบราว์เซอร์จะไม่ทราบขนาด
// ส่วนหัว ('ความยาวเนื้อหา: 100000');
// โหลดกล่องโต้ตอบดาวน์โหลดและบันทึกเป็น download.zip
ส่วนหัว ('เนื้อหา-การจัดสรร: ไฟล์แนบ; filename = download.zip');
// 1,000 ครั้ง 1,000 ไบต์ของข้อมูล
สำหรับ ($ i = 0; $ i <1,000; $ i ++) {
echo str_repeat (., 1,000);
// sleep เพื่อชะลอการดาวน์โหลด
USLEEP (50000);
-
ผลที่ได้กลายเป็นสิ่งนี้:
เบราว์เซอร์นี้จะบอกคุณว่าคุณดาวน์โหลดได้มากแค่ไหน แต่จะไม่บอกคุณว่าคุณต้องดาวน์โหลดทั้งหมดเท่าไหร่ และแถบความคืบหน้าจะไม่แสดงความคืบหน้า
นี่เป็นข้อมูลส่วนหัวอื่นที่สร้างขึ้นสำหรับแคช มันจะมีลักษณะเช่นนี้:
Etag: pub1259380237;gz
เซิร์ฟเวอร์อาจตอบกลับข้อมูลนี้กับแต่ละไฟล์ที่ส่งไปยังเบราว์เซอร์ ค่านี้สามารถมีวันที่ที่แก้ไขแล้วขนาดไฟล์หรือการตรวจสอบไฟล์ของเอกสารล่าสุด การเรียกดูจะแคชด้วยเอกสารที่ได้รับ ครั้งต่อไปที่เบราว์เซอร์ขอไฟล์เดียวกันอีกครั้งคำขอ HTTP ต่อไปนี้จะถูกส่ง:
If-None-Match: pub1259380237;gz
หากค่าเอกสาร ETAG ที่ร้องขอสอดคล้องกับมันเซิร์ฟเวอร์จะส่งรหัสสถานะ 304 แทน 2OO และไม่มีการส่งคืนเนื้อหา เบราว์เซอร์จะโหลดไฟล์จากแคชในเวลานี้
ตามชื่อแนะนำข้อมูลส่วนหัวนี้ใช้รูปแบบ GMT เพื่อระบุเวลาการแก้ไขล่าสุดของเอกสาร:
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT
$modify_time = filemtime($file);
ส่วนหัว (ล่าสุดแก้ไข:. gmdate (d, d myh: i: s, $ modify_time). gmt);
มันให้กลไกการแคชอื่น เบราว์เซอร์อาจส่งคำขอเช่นนี้:
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
เราได้พูดคุยกันแล้วในส่วน if-modified-snice
ส่วนหัวนี้ใช้สำหรับการเปลี่ยนเส้นทาง หากรหัสตอบกลับคือ 301 หรือ 302 เซิร์ฟเวอร์จะต้องส่งส่วนหัว ตัวอย่างเช่นเมื่อคุณเยี่ยมชม http://www.nettus.com เบราว์เซอร์จะได้รับการตอบกลับต่อไปนี้:
HTTP/1.x 301 Moved Permanently
-
สถานที่: http://net.tutsplus.com/
-
ใน PHP คุณสามารถเปลี่ยนเส้นทางผู้เข้าชมด้วยวิธีนี้:
header('Location: http://net.tutsplus.com/');
โดยค่าเริ่มต้นรหัสสถานะ 302 จะถูกส่ง หากคุณต้องการส่ง 301 เพียงแค่เขียนแบบนี้:
header('Location: http://net.tutsplus.com/', true, 301);
เมื่อเว็บไซต์ต้องการตั้งค่าหรืออัปเดตข้อมูลคุกกี้ที่คุณเรียกดูมันจะใช้ส่วนหัวดังกล่าว:
Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT
Set-Cookie: Session-ID = 120-7333518-8165026; เส้นทาง =/; domain = .amazon.com; หมดอายุ = วันเสาร์ 27 ก.พ. 08:00:00 2010 GMT
คุกกี้แต่ละตัวจะใช้เป็นส่วนหัวแยกต่างหาก โปรดทราบว่าการตั้งค่าคุกกี้ผ่าน JS จะไม่ถูกสะท้อนในส่วนหัว HTTP
ใน PHP คุณสามารถตั้งค่าคุกกี้ผ่านฟังก์ชั่น SetCookie () และ PHP จะส่งส่วนหัว HTTP ที่เหมาะสม
setcookie(TestCookie, foobar);
มันจะส่งส่วนหัวแบบนี้:
Set-Cookie: TestCookie=foobar
หากไม่ได้ระบุเวลาหมดอายุคุกกี้จะถูกลบหลังจากปิดเบราว์เซอร์
เว็บไซต์อาจส่งข้อมูลส่วนหัวนี้ผ่าน HTTP เพื่อยืนยันผู้ใช้ หน้าต่างป๊อปอัพจะเปิดขึ้นเมื่อเบราว์เซอร์เห็นการตอบสนองนี้ในหัว
WWW-Authenticate: Basic realm=Restricted Area
มันจะมีลักษณะเช่นนี้:
ในบทของคู่มือ PHP มีรหัสง่าย ๆ ที่แสดงให้เห็นถึงวิธีการทำอะไรแบบนี้กับ PHP:
if (!isset($_SERVER['PHP_AUTH_USER'])) {
ส่วนหัว ('www-authenticate: Realm พื้นฐาน = อาณาจักรของฉัน');
ส่วนหัว ('HTTP/1.0 401 ไม่ได้รับอนุญาต');
echo 'ข้อความที่จะส่งหากผู้ใช้กดปุ่มยกเลิก';
ออก;
} อื่น {
echo <p> สวัสดี {$ _server ['php_auth_user']}. </p>;
Echo <p> คุณป้อน {$ _server ['php_auth_pw']} เป็นรหัสผ่านของคุณ </p>;
-
ส่วนหัวนี้มักจะถูกตั้งค่าเมื่อเนื้อหาส่งคืนถูกบีบอัด
Content-Encoding: gzip
ใน PHP ถ้าคุณเรียกฟังก์ชัน OB_GZHANDLER () ส่วนหัวนี้จะถูกตั้งค่าโดยอัตโนมัติ
ที่อยู่ดั้งเดิม: http://css.net/all-about-http-headers/