2009-08-09 39 views
8

Bạn có thể biết rằng các định dạng tệp có liên quan đến HTML được nén bằng nén GZip, phía máy chủ, (bởi mod_gzip trên máy chủ Apache) và được giải nén bằng các trình duyệt tương thích. ("mã hóa nội dung")Máy chủ GZipping hoạt động như thế nào?

Tính năng này chỉ hoạt động đối với các tệp HTML/XML không? Giả sử tập tin PHP/Perl của tôi tạo ra một số dữ liệu phân tách bằng dấu phẩy đơn giản và gửi dữ liệu đó tới trình duyệt, nó sẽ được mã hóa theo mặc định?

Điều gì về các nền tảng như Silverlight hoặc Flash, khi họ tải xuống dữ liệu như vậy sẽ tự động nén/giải nén trình duyệt/thời gian chạy? Có cách nào để kiểm tra điều này không?

Trả lời

9

Tính năng này chỉ hoạt động đối với các tệp HTML/XML ?

Không: nó thường được sử dụng cho các tệp CSS và JS - vì đó là thứ lớn nhất mà các trang web được tạo ra (trừ hình ảnh), vì các khung công tác JS và các ứng dụng JS đầy đủ, nó đại diện cho một lợi ích to lớn!

Thực ra, mọi định dạng dựa trên văn bản đều có thể được nén khá tốt (ngược lại, hình ảnh không thể, chẳng hạn như chúng thường được nén); đôi khi, dữ liệu JSON trở về từ Ajax yêu cầu được nén quá - đó là dữ liệu văn bản, rốt cuộc cả ;-)

phép nói rằng PHP tập tin/Perl tôi tạo dữ liệu một số dấu phẩy đơn giản phân, và gửi đến trình duyệt , nó sẽ được được mã hóa theo mặc định?

Đó là một vấn đề cấu hình: nếu bạn đã cấu hình máy chủ của bạn để nén mà loại nội dung, nó sẽ có thể được nén :-)
(Nếu trình duyệt cho biết họ chấp nhận dữ liệu gzip-mã hóa)


Dưới đây là một mẫu cấu hình cho Apache 2 (sử dụng mod_deflate) mà tôi sử dụng trên blog của tôi:

<IfModule mod_deflate.c> 
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/xml 
</IfModule> 

ở đây, tôi muốn html/xml/css/JS te được nén.

Và đây là điều tương tự, cộng/trừ một vài tùy chọn cấu hình tôi sử dụng một lần, dưới Apache 1 (mod_gzip):

<IfModule mod_gzip.c> 
    mod_gzip_on     Yes 
    mod_gzip_can_negotiate  Yes 

    mod_gzip_minimum_file_size 256 
    mod_gzip_maximum_file_size 500000 

    mod_gzip_dechunk    Yes 

    mod_gzip_item_include   file  \.css$ 
    mod_gzip_item_include   file  \.html$ 
    mod_gzip_item_include   file  \.txt$ 
    mod_gzip_item_include   file  \.js$ 
    mod_gzip_item_include   mime  text/html 

    mod_gzip_item_exclude   mime  ^image/ 
</IfModule> 

Những điều có thể được nhận thấy ở đây là rằng tôi không muốn quá nhỏ (tăng sẽ không được khá quan trọng) hoặc quá lớn (sẽ ăn quá nhiều CPU để nén) các tập tin được nén; và tôi muốn các tệp css/html/txt/js được nén, nhưng không phải hình ảnh.


Nếu bạn muốn dữ liệu được phân cách bằng dấu phẩy được nén theo cùng một cách, bạn sẽ phải thêm loại nội dung hoặc mở rộng cấu hình của máy chủ web, để kích hoạt nén gzip cho máy chủ.

Có cách nào để kiểm tra điều này không?

Đối với bất kỳ nội dung nào được trả lại trực tiếp cho trình duyệt, tiện ích mở rộng của Firefox Firebug hoặc LiveHTTPHeaders là phải có.

Đối với nội dung không trải qua cách giao tiếp chuẩn của trình duyệt, có thể khó hơn; cuối cùng, bạn có thể phải kết thúc bằng cách sử dụng một cái gì đó như Wireshark để "ngửi" những gì đang thực sự đi qua các đường ống ... Chúc may mắn với điều đó!

gì về các nền tảng như Silverlight hoặc Flash, khi họ tải về dữ liệu như vậy nó sẽ được nén/giải nén bởi trình duyệt/thời gian chạy tự động?

Để trả lời câu hỏi của bạn về Silverlight và Flash, nếu họ gửi tiêu đề Chấp nhận cho biết họ hỗ trợ nội dung nén, Apache sẽ sử dụng mod_deflate hoặc mod_gzip. Nếu họ không hỗ trợ nén, họ sẽ không gửi tiêu đề. Nó sẽ “chỉ hoạt động.” - Nate

+6

Chỉ cần làm rõ cho độc giả trong tương lai: Bất kỳ loại HTTP dữ liệu có thể được nén, thời gian. Nó chỉ là một ý tưởng tồi cho dữ liệu đã được nén, chẳng hạn như hình ảnh. –

+0

@Sean> chính xác; Tôi tự hỏi liệu có ai lấy được thứ gì bằng cách nén lại hình ảnh, btw… Không bao giờ dám kiểm tra nó ^^ (Tôi đoán sự tăng lên sẽ thực sự tối giản, nếu không phải là null, và nó sẽ ăn một số CPU gần như không có gì ...) –

+0

Vâng, tôi đã thấy hình ảnh BMP không nén được phục vụ ... –

5

Tôi nghĩ rằng Apache mod_deflate phổ biến hơn mod_gzip, vì nó được tích hợp và thực hiện tương tự. Xem tài liệu cho mod_deflate (được liên kết ở trên) và bạn sẽ thấy dễ dàng chỉ định loại tệp nào cần nén, dựa trên các loại MIME của chúng. Nói chung, nó đáng để nén HTML, CSS, XML và JavaScript. Hình ảnh đã được nén, vì vậy chúng không được hưởng lợi từ việc nén.

4

Trình duyệt gửi tiêu đề "Chấp nhận mã hóa" với các loại nén mà nó biết cách hiểu. Máy chủ xem xét điều này, cùng với tác nhân người dùng và quyết định cách mã hóa kết quả. Một số trình duyệt nói dối về những gì họ có thể hiểu được, vì vậy điều này phức tạp hơn là chỉ tìm kiếm "làm lệch hướng" trong tiêu đề. Về mặt kỹ thuật, bất kỳ phản hồi HTTP/2xx nào có nội dung có thể được mã hóa nội dung bằng cách sử dụng bất kỳ mã hóa nội dung hợp lệ nào (gzip, zlib, deflate, v.v.), nhưng thực tế là lãng phí khi áp dụng nén cho các loại hình phổ biến vì nó thực sự làm cho chúng lớn hơn.

Bạn chắc chắn có thể nén phản hồi từ các trang PHP động. Phương pháp đơn giản nhất là thêm:

<?php ob_start("ob_gzhandler"); ?> 

vào đầu mỗi trang PHP. Nó tốt hơn để thiết lập nó thông qua cấu hình PHP, tất nhiên.

Có rất nhiều các trang thử nghiệm, dễ dàng tìm thấy với Google:

Các vấn đề liên quan