[PHP] $_SERVER の PHP_SELF / SCRIPT_NAME / REQUEST_URI の違い

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"]);
    

    のようにエスケープしておく必要があります。


    Pocket
    Bookmark this on Yahoo Bookmark

    2件のコメント

  • 2015年7月13日 - 12:13 PM | Permalink

    /abc/sample.php/3 → /abc/sample/3 ではないんですか?

    • tekboy
      2015年7月14日 - 10:15 PM | Permalink

      ご指摘ありがとうございます!
      記事を修正しました。

  • tekboy にコメントする コメントをキャンセル

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>