PHP スーパーグローバル変数-$_SERVER

Webサイトにアクセス時にブラウザとサーバー間で通信を行なっています。
その際、ブラウザに表示される情報以外に「ヘッダー情報(リクエストヘッダー情報)」があります。
今回は、それらの情報を確認するためのスーパーグローバル変数「$_SERVER」を解説します。

この記事の著者 ->S.E; です。
普段は、システム開発に必要なヒアリング、システムの要件定義、設計からプログラマとしてWebサイトやWebアプリケーションの開発、WordPressでのブログの執筆やサーバー運用・管理を行っています。
このページは「未経験の為のプログラミング講座 ゼロから始めるPHPプログラミング〜初級から実践編までを網羅〜」としてPHPの基本的な部分を【初級編】【中級編】【上級編】に分けて解説しています。最終的には簡単なフォームやシステム開発をフルスクラッチで行うことを目的としています。また、参考になる書籍なども紹介しています。
ヘッダー情報(リクエストヘッダー情報)とは?
ブラウザ、サーバー間の通信時にブラウザがサーバーにリクエスストし、サーバーがブラウザにレスポンスする際にやり取りする情報が「ヘッダー情報(リクエストヘッダー情報)」です。
実際の情報を確認してみます。コマンドで
1 | % curl --verbose https://www.programming-se.com/ 1> /dev/null |
を入力しエンターを押下します。
「https://www.programming-se.com」にアクセスした際にやり取りされるヘッダー情報を確認できます。

リクエストヘッダー
1 2 3 4 | > GET / HTTP/1.1 > Host: www.programming-se.com > User-Agent: curl/7.64.1 > Accept: */* |
レスポンスヘッダー
1 2 3 4 5 6 7 8 9 10 11 | < HTTP/1.1 200 OK < Date: Sat, 12 Sep 2020 18:24:10 GMT < Server: Apache < X-Frame-Options: SAMEORIGIN < Link: <https://www.programming-se.com/index.php?rest_route=/>; rel="https://api.w.org/" < Cache-Control: max-age=0 < Expires: Sat, 12 Sep 2020 18:24:10 GMT < Vary: Accept-Encoding < Connection: close < Transfer-Encoding: chunked < Content-Type: text/html; charset=UTF-8 |
ヘッダー情報は「名前:値」で表示されています。
これらの情報を取得することで様々な目的に利用することができます。
$_SERVERを利用して情報を取得
$_SERVERで取得できる情報を全て表示するスクリプトです。
下記の内容をサーバーにアップロードしアクセスすることで結果を得られます。
1 2 3 4 5 6 | <?php // $_SERVERのキー/値を順に取得 foreach( $_SERVER AS $key => $value ){ echo $key.':'.$value.'<br>'; } ?> |
下記が結果です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | HTTPS:on SSL_TLS_SNI:www.programming-se.com HTTP_HOST:www.programming-se.com HTTP_ACCEPT:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 HTTP_COOKIE:〜省略〜 HTTP_USER_AGENT:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Safari/605.1.15 HTTP_ACCEPT_LANGUAGE:ja-jp HTTP_ACCEPT_ENCODING:gzip, deflate, br HTTP_CONNECTION:keep-alive PATH:/sbin:/usr/sbin:/bin:/usr/bin SERVER_SIGNATURE: SERVER_SOFTWARE:Apache SERVER_NAME:www.programming-se.com SERVER_ADDR:164.46.111.244 SERVER_PORT:443 REMOTE_ADDR:150.66.95.168 DOCUMENT_ROOT:/virtual/htdocs/programming-se.com/www SERVER_ADMIN:webmaster@www.programming-se.com SCRIPT_FILENAME:/virtual/htdocs/programming-se.com/www/test.php REMOTE_PORT:30515 GATEWAY_INTERFACE:CGI/1.1 SERVER_PROTOCOL:HTTP/1.1 REQUEST_METHOD:GET QUERY_STRING: REQUEST_URI:/test.php SCRIPT_NAME:/test.php PHP_SELF:/test.php REQUEST_TIME_FLOAT:1599936189.191 REQUEST_TIME:1599936189 |
$_SERVERで取得する情報も「名前:値」で表示されています。
名前を$_SERVER[‘*****‘]の「*****」へ記述することにより個別に取得することができます。
例)$_SERVER[‘SCRIPT_NAME’] => /test.php
例)$_SERVER[‘REQUEST_METHOD’] => GET
といった内容になります。$_GETや$_POSTの値を取得する際利用していた「$_SERVER[‘REQUEST_METHOD’]」まさにこれにあたります。
$_SERVERの利用目的・方法
ではどのような時に$_SERVERを利用するのでしょうか?
POSTとGETの振り分け
$_SERVER[‘REQUEST_METHOD’]を利用してPOSTとGETの振り分けに利用することができます。
フォームからPOST形式でデータが送信された場合のみ処理したい時は
1 2 3 4 5 6 7 8 9 10 11 | <?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ){ // POST時の処理 } else{ // それ以外の時の処理 } ?> |
このように記述する子で振り分けが可能です。
ページ遷移の制御(リファラ)
指定のページに遷移する際、前のページが外部のサイトやローカルでないことを確認して処理を行うことができます。
1 2 3 4 5 6 7 8 9 10 | <?php if( $_SERVER['HTTP_REFERER'] == '指定のページ・ドメイン' ){ // 指定のページ・ドメインからのアクセス時の処理 } else{ // 指定のページ・ドメイン以外からのアクセス時の処理 } |
アクセスしている端末によって表示するページを振り分ける(ユーザーエージェント)
アクセスしてきている端末がPCかスマートフォンか、またはmacOSなのかWindowsなのかを$_SERVER[‘HTTP_USER_AGENT’]で振り分けることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php $ua = $_SERVER[‘HTTP_USER_AGENT’]; if( ( strpos( $ua, 'iPhone' ) !== false ) ||( strpos( $ua, 'Android') !== false ) ){ // PCでのアクセス } else{ // スマートフォンでのアクセス } ?> |
※「strpos」は第一引数内に第二引数の文字列が存在する場所を確認する関数です。
アクセスログをとる
$_SERVER[‘REMOTE_ADDR’] アクセス元のIPアドレスを取得
$_SERVER[‘HTTP_USER_AGENT’] アクセス元のユーザーエージェントを取得
$_SERVER[‘PHP_SELF’] アクセスページを取得
などを利用して簡単なアクセスログをとることも可能です。
$_SERVERを利用してみて
$_SERVERは色々の条件分岐からログの取得など様々な用途に利用されます。
$_POSTや$_GETなどより利用頻度は低いですが、どのようなデータを$_SERVERを利用して取得できるかある程度理解しておくことをお勧めします。
S.E->お勧め記事;
- Shopify APIを利用して在庫管理を行う
- PHP フレームワーク Laravel ディレクティブ – ループ変数 $loop –
- macOS Monterey にアップデート後、composerやhomebrewでenv: php: No such file or directoryが出る
- プログラマー になる為に必要な プログラミング以外 の知識・スキル
- CrowdWorks いつの間にか「プロクラウドワーカー」になっていた
- XSERVERにSSHを利用してLaravel環境を構築する
- PHPフレームワーク「Laravel」ディレクティブ-繰り返し処理(ループ処理)-
- Panic Nova 購入から1年が過ぎライセンスの更新時期の注意点
- CrowdWorks 提案後、受注に繋がりました。提案〜契約までの流れを解説
S.E->PR;
チームのタスク管理ツール【backlog】
FREENANCE(フリーナンス)
S.E->Weekly Ranking;
S.E->プロフィール;

