HTTP/1.1 では、コンテンツの圧縮転送ができるそうです。
最近はブロードバンドが普及しているため 多少のファイル容量は気にせず HTTP 転送されるようになってきていますが、 XML など無圧縮のテキスト形式で大量のデータを転送する場合には、 やはり今後もコンテンツの圧縮転送が必要になりそうです。
クライアント⇒サーバのリクエストヘッダでは
Accept-Encoding: でブラウザ側が利用可能な圧縮形式を提示できます。
対してサーバ⇒クライアントのレスポンスヘッダでは
Content-Encoding: でデータ本文の圧縮形式を通知できるようです。
ブラウザが gzip 圧縮が利用可能かを自動判定して、 HTML 本文を圧縮転送する CGI サンプルプログラムを作成しました。
『Using gzip: YES』と表示されれば、圧縮転送されています。
『Using gzip: NO』と表示されれば、通常通り無圧縮で転送されます。
それ以外の画面が出た場合は、ブラウザ側のエラーか、
またはサーバの不調ですね。
サンプルプログラムのソースは以下の通りです。
#!/usr/bin/perl # gzip-test.cgi ---- sample for "Content-Encoding: gzip" # Copyright 2005 Yusuke Kawasaki # http://www.kawa.net/works/perl/contenc/gzip.html use strict; use Compress::Zlib; # gzip 圧縮モジュール # Accept-Encoding: のカンマ区切りを展開する my $usegzip; foreach my $enc ( split( /\s*,\s*/, $ENV{HTTP_ACCEPT_ENCODING} )) { $enc =~ s/;.*$//s; # ; qs= 等は無視する $usegzip = $enc if ( $enc =~ /^(x-)?gzip$/ ); } # 圧縮可能な場合は Content-Encoding: gzip # 圧縮不可能な場合は Content-Encoding: identity ⇒書かない print "Content-Encoding: $usegzip\n" if $usegzip; # HTTPヘッダを出力する print "Content-Type: text/html\n\n"; # 本文を作成する(配列に突っ込んでいく) my $out = []; push( @$out, "Using gzip: ".($usegzip ? "YES" : "NO")."<BR>\n" ); push( @$out, "<br>\n" ); foreach my $key (qw( HTTP_ACCEPT_ENCODING HTTP_USER_AGENT )) { my $val = $ENV{$key}; $val =~ s/&/&/g; $val =~ s/</</g; $val =~ s/>/>/g; push( @$out, "$key = $val<br>\n" ); } # 本文を1変数にまとめる my $body = join( "", @$out ); # 圧縮可能な場合は本文を圧縮する $body = Compress::Zlib::memGzip( $body ) if $usegzip; # そのまま出力する print $body;
なお、HTTP/1.1 として利用できるエンコーディングは、
gzip、compress、deflate、identity のみ のようです。
(拡張はない)
なお、identity(デフォルト=無圧縮)の場合は、
互換のため Content-Encoding: ヘッダも出力しません。
手元で確認しているところ、以下のようになっています。
携帯電話が対応していると、パケ代節約になって良さそうですけどね。
Internet Explorer 6.0はgzip転送に対応していますが、
オプションで利用禁止にできるようです。
デモにInternet Explorer 6.0アクセスして『Using gzip: NO』と表示される場合は、
インターネットオプション⇒詳細設定⇒HTTP 1.1 設定⇒HTTP 1.1 を使用する
をONにしてから、Internet Explorerを再起動してください。
(ブラウザの全てのウインドウを閉じてから、ブラウザを起動し直す)
ディレクトリ中に hoge.xml と hoge.xml.gz のファイルがあるとき、 Apache の mod_negotiation モジュールにより、 コンテントネゴシエーションの機能が働いて 『Accept-Encoding: gzip』なブラウザからのアクセスでは自動的に hoge.xml.gz を返し、 そうでない場合は通常通り hoge.xml を返す仕組みがあるようです。
この機能を使えば、静的 XML ファイルの圧縮転送は容易に実現できます。
しかし、Apache 2.0 系では特に設定せずにこの機能が動きましたが、
Apache 1.3 系でこの機能を利用する手順は分かりませんでした。残念。
どうやって設定するのでしょう?
トラックバックURL:http://www.kawa.net/service/tb/ajaxtb.cgi/works/perl/contenc/gzip.html
Kawa.netxp © Copyright 2002-2005 Yusuke Kawasaki