PHP入門 | ページ遷移、Cookie、セッション | HTTPヘッダーとページ移動

Webアプリケーションでは、一般的なPCアプリケーションなどとはかなり異なる技術が使われている。そうした「Web特有の技術」について、PHPでの使い方を説明していく。まずは「ページ移動」について説明する。

Webでは、画面の表示はそれぞれ別のWebページで構成されている。そして必要に応じて別のページへ移動しながら表示を変えていく。これが「ページ移動」である。

重要なのは、「ページ移動すると、それまでの情報はきれいに消える」という点である。もちろん情報を保持する方法もあり、それは後で説明する。以前フォームの送信を行ったが、フォームが送信されると対象ページが最初から読み込まれ、すべて新しく作られる。

したがってWebアプリケーションでページ移動を行う場合は、この「ページ移動時に以前の情報は断ち切られる」ということを考えておく必要がある。そのうえで、必要な情報を保持する方法などを考えながらWebアプリケーションを設計していかなければならない。

では前置きはここまでにして、ページ移動について説明しよう。ページ移動はheaderという関数を使って行う。これは次のように実行する。

header(ヘッダーに出力する内容);

少しわかりにくいかもしれない。このheader関数は、HTTPプロトコルの「ヘッダー」にテキストを出力する関数である。なぜそれがページ移動と関係するのだろうか。それは、ヘッダーにページ移動情報を渡すことで、それを受け取ったブラウザーがリダイレクトを行うからである。

Webページは「HTTP」というプロトコルを使って転送されていることは知っているだろう。HTTPは、Webサーバーとクライアント、つまりWebブラウザーの間でどのような手順でやり取りするかを定めた規則のようなものだ。このHTTPという約束や規則に従って、サーバーとブラウザーの間で必要な情報をやり取りしながらWebページへアクセスする。

サーバーからWebページを送るとき、まずサーバーはブラウザーに知らせたいさまざまな情報をヘッダーに入れ、その後にWebページ本体にあたるボディを続けて送る。つまりヘッダーは「ページとして表示されない情報」である。このヘッダー部分に必要な情報を出力するのがheader関数だ。

ページ移動を行う場合は、ヘッダーにLocation:移動先アドレスというテキストを書いて渡す。このLocationヘッダーを受け取ったブラウザーは、渡されたアドレスへリダイレクト、つまりページ移動を行う。このヘッダーを渡すことで、それを受け取ったブラウザーは指定されたページへ再度アクセスし、ページを変更する。

header関数でページ移動する

それでは、ページ移動の簡単な例を作ってみよう。

index.phpの内容

<?php
    if ($_POST != null){
        $url = $_POST['text1'];
        header("Location:{$url}");
    }
?>
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <p><?php echo $url; ?></p>
        <hr>
        <form method="post" action="./index.php">
            <input type="text" name="text1" value="./index2.php">
            <input type="submit" value="移動">
        </form>
        <hr>
    </body>
</html>

index2.phpの内容

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta http-equiv="Content-Type"  content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Index2.php!</h1>
        <p>新しく用意したページです。</p>
        <hr>
    </body>
</html>

ここではindex.phpindex2.phpという2つのファイルを同じ場所に作成する。index.phpでボタンを押すと、index2.phpへ移動するのを確認できるはずだ。

実際に試してみると、「これは<a>タグで移動するのと何が違うのか」と思うかもしれない。しかし、明らかに違う。<a>タグは単に指定したページへ移動するだけだが、これはまずページに書かれているPHPスクリプトを実行し、その中で移動先を指定できるという点が異なる。つまり、サーバーでスクリプトが処理される段階で、それを受け取ったクライアントに「このページへ移動せよ」と指定できる。したがって、必要な処理とページ移動を組み合わせられる。

このheaderによるページ移動で注意すべき点は、「headerを実行すると、その後の処理は実質的に無効になる」ということである。ブラウザーがヘッダーを受け取った段階で該当ページへ移動してしまうため、その後に何が書かれていても意味がなくなる。Locationheaderで書く前に、すべての処理を済ませておく必要がある。

もう1つの注意点は、headerは何かを出力する前に実行しなければならないということだ。これはよく起こる問題である。ヘッダーは本文より前に送信されるため、echoやHTMLタグなどで何かを出力しようとすると、自動的にその時点でヘッダーが先に送られてしまう。一度ヘッダーが送られると、別のヘッダーを再送信することはできない。

したがって、header関数は必ず何かを出力する前に実行しなければならない。PHPはHTMLタグの中にスクリプトを書くため、<?php ?>タグ以外に何かが書かれていれば、そのまますぐ出力される。たとえば<?php ?>タグの前に改行が1つでもあれば、すでに改行コードが送信されているため、header関数は使えなくなる。この点はよく理解しておこう。