PHP のスーパーグローバル配列に $_SERVER というのがあります。
ここには、サーバに関する情報、PHP実行時のスクリプトのパス、ブラウザから送信されたヘッダ情報など様々な情報が含まれています。
この $_SERVER の中に、実行される PHP スクリプトに関する情報がいくつか含まれています。
代表的なものが、 PHP_SELF / SCRIPT_NAME / REQUEST_URI で、自分自身のページへのリンクを作成する場合や、自分自身のページへ送信するフォームを作成する場合などに使いたいことがありますが、それぞれの違いがいまいち分かりにくかったので、違いを簡単にまとめてみました。
単純な URL の場合
http://www.example.com/abc/sample.php
のような単純な URL の場合は、PHP_SELF / SCRIPT_NAME / REQUEST_URI ともに同じ結果となります:
echo $_SERVER["PHP_SELF"]; // ---> /abc/sample.php と表示 echo $_SERVER["SCRIPT_NAME"]; // ---> /abc/sample.php と表示 echo $_SERVER["REQUEST_URI"]; // ---> /abc/sample.php と表示
GET パラメータ付き URL の場合
http://www.example.com/abc/sample.php?id=3
のように、GET パラメータが付いた URL の場合は、PHP_SELF / SCRIPT_NAME / REQUEST_URI で以下のような違いが出てきます:
echo $_SERVER["PHP_SELF"]; // ---> /abc/sample.php と表示 echo $_SERVER["SCRIPT_NAME"]; // ---> /abc/sample.php と表示 echo $_SERVER["REQUEST_URI"]; // ---> /abc/sample.php?id=3 と表示
REQUEST_URI だけ GET パラメータを含んだ情報が取得できます。
GET パラメータを mod_rewrite などを使用して静的な URL に変換している場合
mod_rewrite などを使用して、GET パラメータを含んだ URL を静的な URL に変換している場合は、例えば以下のような URL が使われます。
http://www.example.com/abc/sample/3
ここで、URL の書き換えルールが「sample/数字」 ⇒ 「sample.php?id=数字」のようになっていたとします。
この場合、PHP_SELF / SCRIPT_NAME / REQUEST_URI で以下のような違いが出てきます:
echo $_SERVER["PHP_SELF"]; // ---> /abc/sample.php と表示 echo $_SERVER["SCRIPT_NAME"]; // ---> /abc/sample.php と表示 echo $_SERVER["REQUEST_URI"]; // ---> /abc/sample/3 と表示
PHP_SELF と SCRIPT_NAME では、実際に呼び出された PHP ファイルの名前が格納され、REQUEST_URI は指定された URL そのものが格納されるようですね。
どのような情報を取得したいかによって使い分けが出来ますね。
因みに、$_SERVER["PHP_SELF"] は、echo などでそのまま出力すると、XSS (クロスサイト・スクリプティング)攻撃の対象となるため、htmlspecialchars() などを使って、
echo htmlspecialchars($_SERVER["PHP_SELF"]);
のようにエスケープしておく必要があります。
2件のコメント
/abc/sample.php/3 → /abc/sample/3 ではないんですか?
ご指摘ありがとうございます!
記事を修正しました。