เป็นไปได้หรือไม่ที่จะเปิดใช้งานการบีบอัด http สำหรับคำขอ


35

ฉันเห็นข้อมูลมากมายเกี่ยวกับการเปิดใช้งานการบีบอัด http สำหรับการตอบกลับของเซิร์ฟเวอร์ แต่จะเกี่ยวกับการร้องขอขาเข้า มันจะไม่เหมาะสมสำหรับเบราว์เซอร์ที่จะบีบอัดแบบฟอร์มโพสต์ขนาดใหญ่ก่อนที่จะส่งไปยังเซิร์ฟเวอร์?

อีกตัวอย่างหนึ่งคือบริการเว็บ REST ที่เราใช้ เราต้องส่งคำขอ PUT บ่อยครั้งด้วยไฟล์ XML ขนาดใหญ่ (10+ MB) และแน่นอนจะเห็นประโยชน์แบนด์วิดท์ / ความเร็วทั้งสองด้าน

ดังนั้นนี่เป็นปัญหาที่แก้ไขแล้วในฝั่งเซิร์ฟเวอร์หรือแต่ละเว็บแอปพลิเคชันต้องจัดการแยกต่างหากหรือไม่?

คำตอบ:


30

หากต้องการPUTข้อมูลไปยังเซิร์ฟเวอร์ที่ถูกบีบอัดคุณต้องบีบอัดเนื้อหาคำขอและตั้งค่าContent-Encoding: gzipส่วนหัว ส่วนหัวของตัวเองจะต้องไม่บีบอัด มันเป็นเอกสารในmod_deflate :

โมดูล mod_deflate ยังมีตัวกรองสำหรับการคลายการบีบอัดตัวร้องขอการบีบอัด gzip เพื่อเปิดใช้งานคุณสมบัตินี้คุณจะต้องแทรกตัวกรอง DEFLATE ลงในห่วงโซ่ตัวกรองข้อมูลเข้าโดยใช้ SetInputFilter หรือ AddInputFilter

...

ตอนนี้หากคำขอประกอบด้วยส่วนหัวของการเข้ารหัสเนื้อหา: gzip เนื้อหาจะถูกคลายลงโดยอัตโนมัติ มีเบราว์เซอร์เพียงเล็กน้อยที่มีความสามารถในการ gzip คำขอเนื้อหา อย่างไรก็ตามแอปพลิเคชันพิเศษบางตัวรองรับการบีบอัดคำขอจริงเช่นบางไคลเอ็นต์ WebDAV

และบทความอธิบายมันอยู่ที่นี่ :

แล้วคุณจะทำอย่างไร นี่คือการแจ้งความที่ชัดเจนอีกครั้งจากซอร์สโค้ด mod_deflate: ใช้งานได้เฉพาะกับคำขอหลัก / ไม่มีรายงานย่อย ซึ่งหมายความว่าเนื้อความทั้งหมดของคำขอต้องถูกบีบอัด gzip ถ้าเราเลือกที่จะใช้มันเป็นไปไม่ได้ที่จะบีบอัดเฉพาะส่วนที่มีไฟล์เช่นในคำขอแบบหลายส่วน

เบราว์เซอร์สามารถขอเนื้อหาการตอบสนองจากเซิร์ฟเวอร์แยกจากกันโดยตั้งค่าAccept-Encodingหัวข้อที่นี่ :

GET /index.html HTTP/1.1
Host: www.http-compression.com
Accept-Encoding: gzip
User-Agent: Firefox/1.0

นี่จะส่งคืนข้อมูลที่ถูกบีบอัดไปยังเบราว์เซอร์


5
+1 NB you must compress the whole request, inclusive of headerคุณเขียน อย่างไรก็ตามส่วนหัว http จะต้องไม่ถูกบีบอัด สิ่งเดียวที่จะต้องมีการบีบอัด (เต็มตามบทความที่คุณพูดถูกต้องรัฐ) เป็นเนื้อหาของ http
Eugene Beresovsky

1
นี่เป็นความผิดพลาด: Accept-Encodingบอกเซิร์ฟเวอร์ว่าการบีบอัดไคลเอ็นต์สนับสนุนอะไร ส่วนหัวContent-Encodingอธิบายถึงการบีบอัดของร่างกาย
maaartinus

@maaartinus เห็นข้อความแรกที่อ้างถึงย่อหน้าที่สอง ฉันจัดระเบียบคำตอบใหม่เพื่อความชัดเจน
แอนดี้

4

ตอบส่วนที่เกี่ยวกับคำขอที่บีบอัดไม่ใช่คำตอบ: ใช่เป็นไปได้แม้ว่าจะดูเหมือนจะไม่มีการใช้งานอย่างแพร่หลาย แอปฝั่งไคลเอ็นต์จำเป็นต้องตั้งส่วนหัวการเข้ารหัสเนื้อหาที่เหมาะสม สำหรับแอพฝั่งเซิร์ฟเวอร์มี 2 ตัวเลือก:

  1. แอพรองรับการคืนค่าเนื้อหาคำขอด้วยตัวเอง ตัวอย่างไลบรารีที่สามารถทำได้คือ phpxmlrpc

  2. เว็บเซิร์ฟเวอร์พองตัวตอบสนองก่อนที่จะส่งผ่านไปยังแอป สิ่งนี้เป็นไปได้โดยใช้ fe ตัวกรอง mod_deflate ของ Apache และตั้งค่า inputFilter


2

ไม่ได้มาจากเบราว์เซอร์ใด ๆ ที่ฉันรู้จักคุณต้องหาปลั๊กอินที่เหมาะสมสำหรับคุณ โดยทั่วไปคุณต้องตั้งค่าส่วนหัว HTTP เข้ารหัสเนื้อหาเพื่อให้เซิร์ฟเวอร์ทราบว่าคำขอจะเข้ามาแน่นอนว่าเซิร์ฟเวอร์ต้องสามารถจัดการการเข้ารหัสนั้นได้


0

สิ่งนี้ไม่ได้รับอนุญาต ตามข้อกำหนด HTTP ( RFC 2616 ) Content-Encodingไม่ใช่ฟิลด์ส่วนหัวคำขอที่เป็นไปได้ดังนั้นจึงเป็นไปไม่ได้ที่จะบีบอัดเนื้อหาองค์กรที่ร้องขอเนื่องจากไม่มีวิธีการทางกฎหมายที่จะแจ้งให้เซิร์ฟเวอร์ทราบว่าเกิดเหตุการณ์นี้ขึ้น การบีบอัดของคำขอร่างกายจะทำเฉพาะในฐานะส่วนขยายที่ไม่ได้มาตรฐาน


12
คำตอบนี้ไม่ถูกต้องRFC 2616กล่าวถึงโดยเฉพาะที่If the content-coding of an entity in a request message is not acceptable to the origin server, the server SHOULD respond with a status code of 415 (Unsupported Media Type).ระบุเพิ่มเติมโดยRequest and Response messages MAY transfer an entity if not otherwise restricted by the request methodและContent-Encodingถูกระบุว่าเป็นตัวเลือกในentity-header
PeterT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.