[PHP-users 16402]headerってなによ?(was 他のディレクトリの変更)

ysano ysano @ ysnet.org
2003年 7月 2日 (水) 20:24:34 JST


ysanoです。

この問題は中村さん自身が最初におっしゃっていたように、
ApacheのAliasでももちろん解決できますよ。
Alias /img/ "C:\Files\img"とか、かな。
ただ、なるべくPHPでとのことだったので、みんなPHPで考えてます。

以下、ヘッダ絡みで徒然と書いてみます。

index.htmlに<img src="img.jpg">とあったとします。
まずブラウザでindex.htmlにアクセスします。
するとApacheはリクエストされたURLの拡張子がhtmlなので
text/htmlというContent-typeヘッダをブラウザに送ります。
Apacheは続けてindex.htmlの中身を送ります。
ブラウザはApacheが送ってきたヘッダがtext/htmlなので、続けて送られてきた
データがhtmlファイルだと判断できます。そしてhtmlとしてレンダリングしよう
と試みます。中には<img>タグがあります。そのファイル名はimg.jpgですので、
ブラウザはその内容を取得しようとApacheにリクエストします。Apacheはimg.
jpgは拡張子がjpgであるのでimage/jpegというContent-typeヘッダをブラウザに
送ります。
続けてApacheはimg.jpgの中身を送ります。
ブラウザはApacheが送ってきたヘッダがimage/jpegなので、続けて送られてきた
データがjpgファイルだと判断できます。そしてイメージとしてレンダリングし
ようと試みます。
そして先ほどのhtmlを解釈しながらイメージもレンダリングされます。

で、<img src="showjpg.php?fn=img.jpg">というタグの場合を考えてみます。
一瞬見ると、画像ファイルじゃないし、なんでphpなんだと思われるかもしれま
せん。でもこの場合もファイル名は違えど、Apacheとブラウザ間のデータのやり
取りは一緒です。
Apacheはshowjpg.phpの拡張子がphpなのでPHPスクリプトだと解釈します。
そしてPHPスクリプトはheader()関数でimage/jpegをブラウザに送り、
これから送るデータがjpgファイルであることをブラウザに伝えます。
そしてreadfile()関数がjpgファイルの中身を送ります。ブラウザは同様に、
送られてきたヘッダから判断して、イメージとしてそのデータをレンダリングし
ます。

以上のデータの流れを実際に確認してみてください。

普段headerなんか使って無いのに・・・って思うかもしれませんが、
php.iniで
default_mimetype = "text/html"
ってありますよね。これは何もheader()関数で指定して無い場合はhtmlファイル
として解釈してね、とブラウザに知らせているということなのです。
この場合のヘッダも確認できますので試してください。

-- 
ysano



PHP-users メーリングリストの案内