apacheはContent-LengthレスポンスヘッダがないとRangeリクエストが有効にならない

っていうことを知らなかった。versionによるかも? 試したのは2.2.15。rangeリクエストはレジュームによる再DLとかで、コンテンツの一部を取得したいときに使う。他には携帯で動画をDLして再生するときとかに使われてる?

rangeリクエスト

rangeリクエストが正常に出来た場合は、応答は206 Partial Contentで返ってくる。でもapachecgi/ssiに対してrangeリクエスト送ってもstatus 200でコンテンツ全体が返ってきたので、おや?と調べてるうちにタイトルの結果に辿り付いた。

cgiでもアプリでContent-Lengthヘッダをつけたり、apacheのmod_deflateと組み合わせてContent-Lengthヘッダをつければ(apacheが勝手につける) rangeリクエストにも対応するぽひ。やってみた。

まずはサーバとコンテンツの状態確認。

$ telnet localhost 80
HEAD /hoge.cgi HTTP/1.0

HTTP/1.1 200 OK
Date: Sat, 24 Jul 2010 01:28:39 GMT
Server: Apache
Last-Modified: Tue, 03 Mar 2009 08:31:07 GMT
Accept-Ranges: bytes
Content-Length: 4000
Connection: close
Content-Type: text/html

コンテンツのサイズは4000バイト。Accept-Rangesの結果から、byte単位でrangeリクエストに対応していることがわかる。なので先頭から90bytes取得するリクエスト送ってみた。

$ telent localhost 80
GET /hoge.cgi HTTP/1.0
Range: bytes=0-90

HTTP/1.1 206 Partial Content
Date: Sat, 24 Jul 2010 01:31:33 GMT
Server: Apache
Last-Modified: Tue, 03 Mar 2009 08:27:25 GMT
Accept-Ranges: bytes
Content-Length: 91
Content-Range: bytes 0-90/4000
Connection: close
Content-Type: text/html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta

http statusが206、Content-Rangeから4000bytes中、指定した部分だけ取得している。