「PHPスクリプトを書いてみよう」シリーズの第2回です。 今回はHTTPヘッダの出力について説明します。
HTTPヘッダって何ですか
一般にWebページには、画面に表示される本体データの直前に、ブラウザへの指示を与える「見えないデータ」が付いています。それがHTTPヘッダです。
普通は見えないHTTPヘッダも、専用のツールを使えば確認できます。たとえば前の記事で書いた 「HTTPヘッダを表示するPythonスクリプト」の実行例を再掲します。
C>py head-web.py
Date : Thu, 13 Feb 2020 15:37:58 GMT
Content-Type : text/html; charset=UTF-8
Content-Length : 15
Connection : close
X-Powered-By : PHP/7.3.10
Vary : Range
Accept-Ranges : none
Server : Apache
HTTPヘッダの各行がそれぞれ別の設定を意味し、すべて「項目名:設定値」という形式をとります。
代表的なHTTPヘッダのご紹介
HTTPヘッダの種類は非常に多く、IANAに登録されたHTTPヘッダだけでも、本記事の執筆時点で300個以上あります。すべて把握するのは無理なので、ここでは代表的なものをいくつか紹介します。
- Content-Type
次のような形式で、Webページ本体のMediaTypeをあらわします。
Content-Type : text/html (HTML文書)
Content-Type : img/jpeg (JPEG画像)
詳しくは、IANAに登録されたMediaTypeの一覧表を見てください。
- Content-Type + charset
Content-Typeがテキスト系(text/*)の場合は、オプションで文字セットを指定できます。
Content-Type: text/javascript; charset=UTF-8
Content-Type: text/plain; charset=Shift_JIS
文字セットの指定は、HTML文書ならmetaタグも使えるのですが、他の種類のテキストデータではContent-Typeヘッダを使うしかありません。
- Cache-Control
ブラウザがWebページをキャッシュすべきかどうか指定します。特にPHPで作る動的なWebページでは、しばしばキャッシュ禁止の指定が行われます。
Cache-Control: no-cache (キャッシュを禁止する)
- Access-Control-Allow-Origin
最近のブラウザはセキュリティのため、あるサーバのWebページから別サーバのJavaScriptの実行を制限しています。しかしJavaScript側で、たとえば
Access-Control-Allow-Origin: http://example.net/
というHTTPヘッダを送信すると、このJavaScript は example.net に限っては実行可能になります。また jquery.js のような公開ライブラリの場合、
Access-Control-Allow-Origin: *
というHTTPヘッダが設定され、誰でも利用可能になっています。
PHPでHTTPヘッダを出力する
PHPでは出力するデータのHTTPヘッダを自由に設定できます。
サンプルとして、「IPアドレスを得るJavaScript」をPHPで作ってみましょう。次にコードを示します。「ipjs.php」という名前で保存してください。
<?php
$ipaddress = $_SERVER["REMOTE_ADDR"] ?? "no IPaddress";
header("Content-Type: text/javascript; charset=utf-8");
header("Cache-Control: no-cache");
header("Access-Control-Allow-Origin: *");
print("ipv4 = '$ipaddress';\n");
実際にサーバに置いてみました。
このページは「IPアドレスを得るJavaScript」を出力するものなので、HTMLの<script>タグで読み込むことができます。
また、同様のPHPスクリプトをIPv6対応のサーバにも置いてみました。
こちらはユーザーがIPv6で接続すると、「IPv6アドレスを得るJavaScript」を出力します。
次回へ続く
このようにHTTPヘッダを指定することで、PHPでは出力するページにさまざまな属性を与えることができます。応用方法は無限です。
ちょっと長くなったので今回はここまでとします。次回は、ここで作ったスクリプトを利用してWebページを作ってみます。
コメント