HTTP通信とPHPのスーパーグローバル変数の関係

register_globalディレクティブの機能

WordPress起動時に読み込まれるPHPファイルを追っていくためには、php.ini、httpd.conf、.htaccessファイル、PHPスーパーグローバル変数、サーバー変数、HTTP通信など、WEB通信で登場するキーワードの相関関係を理解する必要があります。

WordPressを起動する際の初期設定モジュールであるwp-settings.phpから、load.phpのwp_unregister_GLOBALS()関数を呼び出して、php.iniのregister_globalディレクティブをOFFにします。

スーパーグローバル変数$_GETや$_POSTが取得するデータは

$変数1=$_GET[‘変数1’];
$変数2=$_POST[‘変数2’];

のように初期化(代入)することにで、コード中の$変数1と$変数2が利用できるようになりますが、これがregister_globalディレクティブがONのままだと、上記の代入なしで$変数1と$変数2が、デフォルトでグローバル変数として値を持ってしまいます。

またサーバーから返信されるレスポンスヘッダーに含まれる環境変数から、現在実行されているPHPスクリプトのパスを参照するとき、スーパーグローバル変数で$_SERVER[“PHP_SELF”]としなくても、$PHP_SELFだけで参照できます。

このようにGET、POST、環境変数などPHPの外部からくる値が$変数名というフォーマットで使用できてしまうと、仮にURLのクエリストリングで「index.php?wp_did_header=dummy」とかやられたら、コード上で$wp_did_header変数にdummyという値が格納されてしまい、WordPressが起動時にwp-blog-header.phpでエラーを起こす可能性があります。

スーパーグローバル変数が勝手にグローバル変数に展開されると手間が省ける反面、セキュリティ上よろしくないということで、register_globalディレクティブのデフォルトがPHP5.4になってからOFFになりました。

register_globalディレクティブと$GLOBALSの関係

$GLOBALSはグローバルスコープで定義済みのすべての変数への参照を持つ特殊なスーパーグローバル変数です。

グローバルスコープの変数の値が、ローカルスコープで$GLOBALSによって参照できています。

$foo in global scope: グローバル変数
$foo in current scope: ローカル変数

仮にregister_globalディレクティブがONの場合、HTTP通信でクライアントからリクエストが送信されるたびに、連想配列であるスーパーグローバル変数$GLOBALSに対して、[キー=>値]として自動的に値がセットされます。

HTTP通信とスーパーグローバル変数の関係

WEBシステムはクライアント(ブラウザ)からのリクエストとサーバー(PHP)からのレスポンスをHTTP通信で行なうことを前提に構築されます。

開発したHTMLもCSSもJavaScriptもPHPも、すべてサーバー上に置かれ、クライアントが送信したリクエストに基づいて、サーバーはPHPで処理を行い、結果をHTML形式でクライアントに送信し、ブラウザが描画(rendering)することでWEBサイトが見られる仕組みです

このHTTP通信の際に、PHPではクライアントからのリクエストヘッダは$_SERVERで、フォームに入力したリクエスト本体は$_GETや$_POSTで参照でき、スーパーグローバル変数としてPHPのコード中で使用します。

リクエスト本体は$_GETや$_POSTで取得できるものが$_REQUESTでも取得できますが、キーが同じだと上書きされてしまうので使いません。

これはコンタクトフォームページへのアクセス時のヘッダ情報ですが、リンクからアクセスする場合でもアドレスバーに直接URLを打ち込む場合でも、指定したコンテンツを取得するためのリクエストGET通信で行なわれます。

そしてサーバーから、処理結果としてヘッダー情報がレスポンスされます。

コンタクトフォームからメッセージを送信する際はPOST通信で行なわれます。

そしてサーバーから、処理結果のヘッダーがレスポンスされます。

レスポンスヘッダにPHPコードからヘッダ情報を追加

PHPコード中から、header()関数にて、レスポンスヘッダにLocationヘッダを追加してクライアントに送信すると、それを受けたブラウザは他サイトにリダイレクトします。

PHPコード中から、header()関数にて、HTTPステータス401を追加してクライアントに送信すると、それを受けたブラウザは認証ダイアログを表示します。

それ以外にもステータスコードは301(恒久的移動)、401(HTTP認証要求)、404(Not Found)など、目的に応じてヘッダ情報のHTTPステータスとしてクライアントに送信されます。

サーバー変数とApacheディレクティブの関係

連想配列であるスーパーグローバル変数$_SERVERで参照できるリクエストヘッダとレスポンスヘッダのプレフィックスはHTTP_です。

それ以外にプレフィックスがHTTP_でないサーバー変数が参照でき、もしphp.ini上のregister_globalディレクティブがONであれば$HTTPSだけで参照できます。

サーバ変数とはサーバが生成する変数であり、ヘッダやパス・スクリプトの位置などにアクセスできる変数です。

.htaccessはApacheで使用されるディレクトリ単位に、Webサーバの動作を制御するために置かれるApacheのディレクティブを記述したファイルであり、ディレクトリにベーシック認証をかけたり、mod_rewriteモジュールが実装するディレクティブでhttpd.confの設定を上書きすることができます。

Apacheのrewrite_modeモジュールが実装するディレクティブで.htaccessによってhttpd.confを上書きしますが、ここでサーバー変数であるHTTPSを見て、SSL通信の有無を判断しています。

サイトを常時SSL化した後のリダイレクト処理時にHTTPステータスコードを302(一時的な移動)にしてしまうと、クローラーがリダイレクト先をインデックス化してくれませんので、SEOの観点から必ず301(恒久的な移動)にする必要があります。

こんな投稿も読まれています