【PHP入門】ページの切り替え自由自在!簡単なルーターを作って仕組みを理解しよう
これまでの学習で、PHPを使ってデータベースから情報を取得し、動的なページを生成できるようになりました。しかし、Webサイトには「トップページ」「会社概要」「お問い合わせ」など、複数の異なるページが存在するのが普通です。これらのページを、ヘッダーやフッターを共通化しつつ、効率的に管理するにはどうすればよいのでしょうか?
その答えが「ルーティング」という考え方です。ルーティングとは、ユーザーがアクセスしたURLに応じて、表示するコンテンツを切り替える「交通整理」の役目を担う仕組みです。この記事では、`index.php?page=about`のようなURLパラメータを使い、PHPでごく簡単なルーターを自作します。Laravelなどの本格的なフレームワークが裏側で何をやっているのか、その核心部分に触れることで、Webアプリケーションの構造への理解を深め、次の学習への大きな一歩としましょう!
確認日と対象
確認日: 2026年5月19日。PHPの学習用に、index.php?page=about のようなURLパラメータで表示するページを切り替える初心者向けの記事です。
本番サイトでそのまま使う完成ルーターではありません。ロリポップなどのレンタルサーバーへ上げる前に、読み込めるページ名、404の出し方、includeパス、秘密情報をAIへ貼らないことを確認するための基礎として使ってください。
このページで整理できること
index.phpを入口にして、URLパラメータで表示ページを切り替える考え方- 読み込めるページ名を固定し、意図しないファイルをincludeしないための確認
- 存在しないページをPHPエラーではなく404として扱う考え方
- ロリポップ本番で404、真っ白、includeパスずれが起きた時の次の確認先
- AIやCodexへ相談する時に、公開URL、ファイル構成、エラー文だけを安全に渡す方法
最初に分けること
簡易ルーターで詰まった時は、コードを何度も貼り替える前に、URL、読み込むファイル、サーバー上の場所を分けます。
| 見えている状態 | 最初に疑うこと | 次に見るページ |
|---|---|---|
?page=about だけ404になる |
許可リストにページ名がない、または about.php が同じ場所にない |
アップロード後404の確認 |
| ローカルでは動くが本番で真っ白になる | PHP構文エラー、includeパス、大文字小文字、ファイルの置き場所 | PHP真っ白の確認 |
| 共通ヘッダーやフッターだけ読み込めない | include の相対パス、本番ディレクトリの違い |
本番includeパスの確認 |
| AIが出したルーターをどこへ貼るか分からない | 既存の index.php、共通パーツ、公開フォルダへの影響範囲 |
AIコード安全入口 |
| 公開後にGoogleでURLが見つからない | 公開URL、内部リンク、sitemap.php、canonical/noindex |
Search Console公開後確認 |
PHPを動かすための準備(開発環境)まだXAMPP「ザンプ」を構築してない方は、【PHP入門】XAMPPのダウンロードとインストール方法を徹底解説!を参照してください。 インストール後、指定されたフォルダ(`htdocs`など)にPHPファイルを置けば、準備は完了です!
先に確認:簡易ルーターで作る範囲
このページのルーターは、PHPの仕組みを理解するための小さなサンプルです。本番サイトで使う場合は、読み込めるファイルを固定し、存在しないページは404として扱う前提で作ります。
- PHPの基本がまだ不安なら、先に PHPで動的なWebサイトを作る基本 を確認します。
includeとrequireの違いが曖昧なら、PHPのrequireとincludeの違い を見てください。- フォームやログインを作る前なら、PHPフォームの安全対策 もあわせて確認します。
- 本番公開前は、PHPサイトを安全に更新する手順 を見てからアップロードします。
1. ルーティングの仕組みとは?PHPによる交通整理
ルーティングの仕組みは、大きなビルの受付案内係に例えることができます。訪問者(ユーザー)は皆、まず同じ正面玄関(index.php)にやってきます。そして、受付(ルーター)に「〇〇部に行きたいです(`?page=about`)」と告げます。すると、受付は行き先に応じて適切な部署(about.php)へと案内してくれます。
この仕組みを作るために、PHPの以下の3つの要素を使います。
$_GET変数: URLの末尾に付いている?page=aboutのような「クエリ文字列」から、pageの値(この場合は`about`)を受け取るためのPHPの特殊な変数です。include文: 別のPHPファイルの内容を、指定した場所に読み込んで合体させる命令です。これにより、ヘッダーやフッターを共通化できます。file_exists()関数: 悪意のあるURLが指定された場合に備え、読み込もうとしているファイルが実際にサーバーに存在するかどうかをチェックする、セキュリティ上とても重要な関数です。
これらの部品を組み合わせることで、URLに応じて表示内容を切り替えるルーターが完成します。
2. 実践!簡易ルーターを3つのファイルで作る
それでは、実際に簡易ルーターを作ってみましょう。今回は以下の3つのファイルを用意し、すべて同じフォルダに保存してください。
- index.php: 全ページの骨格となるレイアウトと、交通整理を行うルーター本体。
- home.php: トップページとして表示するコンテンツ部分。
- about.php: 「このサイトについて」ページとして表示するコンテンツ部分。
ファイル1: index.php (ルーター兼レイアウト)
このファイルが、私たちのサイトの「正面玄関」です。ナビゲーションなどの共通部分と、URLに応じて中身が切り替わるコンテンツ表示エリアを持ちます。これが「まるっと動く完全HTMLの例」になります。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>簡易ルーターのサイト</title>
<style>
body { font-family: sans-serif; line-height: 1.8; }
.container { max-width: 800px; margin: 20px auto; padding: 20px; border: 1px solid #ddd; }
nav { background: #f0f0f0; padding: 10px; margin-bottom: 20px; }
nav a { margin-right: 15px; text-decoration: none; color: #0056b3; }
nav a:hover { text-decoration: underline; }
.content { border-top: 2px solid #eee; padding-top: 20px; }
footer { margin-top: 30px; text-align: center; font-size: 0.9em; color: #777; }
.not-found { color: red; font-weight: bold; }
</style>
</head>
<body>
<div class="container">
<header>
<h1>簡易ルーターのサンプルサイト</h1>
</header>
<nav>
<a href="index.php?page=home">ホーム</a>
<a href="index.php?page=about">このサイトについて</a>
</nav>
<div class="content">
<?php
// 1. URLパラメータから表示するページ名を取得
// パラメータがない場合は 'home' をデフォルトとする
$page = $_GET['page'] ?? 'home';
// 2. 表示を許可するページのリスト(ホワイトリスト)
$allowed_pages = ['home', 'about'];
// 3. ページ名が許可リストに含まれているかチェック
if (in_array($page, $allowed_pages)) {
// 4. 対応するファイルパスを作成
$file_path = $page . '.php';
// 5. ファイルが存在するか最終確認してから読み込む
if (file_exists($file_path)) {
include($file_path);
} else {
echo '<p class="not-found">エラー: ファイルが見つかりません。</p>';
}
} else {
// 許可されていないページが指定された場合
echo '<p class="not-found">404 Not Found: 指定されたページは存在しません。</p>';
}
?>
</div>
<footer>
<p>© 2025 Simple Router Inc.</p>
</footer>
</div>
</body>
</html>
ファイル2: home.php (ホームのコンテンツ)
`index.php`に読み込まれる、ホーム(トップページ)の内容だけが書かれたファイルです。
<h2>ようこそ!</h2>
<p>ここはホームページです。</p>
<p>上のナビゲーションをクリックすると、URLの ?page= の値が変化し、表示されるコンテンツが切り替わります。</p>
ファイル3: about.php (サイトについてのコンテンツ)
同様に、`index.php?page=about`が指定されたときに読み込まれる内容です。
<h2>このサイトについて</h2>
<p>このサイトは、PHPの簡易的なルーティングの仕組みを学ぶためのサンプルです。</p>
<p>index.phpが土台となり、URLパラメータに応じてこのabout.phpなどの異なるファイルの内容を動的に読み込んでいます。</p>
これで準備完了です。ブラウザで`index.php`にアクセスしてみてください。ナビゲーションのリンクをクリックするたびに、中央のコンテンツだけが「ホーム」と「このサイトについて」で切り替わるのが確認できるはずです。
3. 気をつけるべき点:ディレクトリトラバーサル攻撃
簡易ルーターを自作する上で、絶対に知っておかなければならないのが**ディレクトリトラバーサル**という攻撃です。もし、セキュリティ対策をせずに以下のようなコードを書いてしまうと、非常に危険です。
<?php
// 悪い例:絶対に真似しないでください!
$page = $_GET['page'];
include($page . '.php'); // ユーザーの入力を検証せずにそのまま使っている
?>
このコードでは、攻撃者がURLに `?page=../../../../etc/passwd` のような特殊な文字列を指定することで、サーバー上の本来アクセスしてはいけない重要な設定ファイルなどを読み取れてしまう可能性があります。
この攻撃を防ぐために、私たちの`index.php`の例では2段階のチェックを入れています。
- **ホワイトリスト方式**: `$allowed_pages`という許可リストを作り、指定されたページ名がその中にあるか`in_array()`でチェックする。
- **ファイルの存在確認**: 許可リストを通過しても、念のため`file_exists()`でファイルが実際に存在するかを最終確認する。
この対策により、意図しないファイルが読み込まれるのを防ぎ、安全性を高めています。
404とエラー表示を分ける
存在しないページを指定された時は、PHPエラーとして見せるのではなく、ユーザー向けには404ページを表示します。一方で、開発者側はエラーログを確認できるようにしておくと、公開後の原因調査が楽になります。
- URLが間違っている: 404ページを表示する。
- 読み込むPHPファイルが存在しない: ファイル配置やアップロード先を確認する。
- includeで真っ白になる: エラーログを確認する。
ロリポップで404になる場合は アップロード後に404になる時の確認順番、includeのパスで失敗する場合は 本番でincludeパスがずれる時の直し方、真っ白になる場合は PHPが真っ白になる時の確認順番 を確認してください。
AIやCodexに相談する時のメモ
ルーターの不具合を相談する時は、FTP情報、サーバー管理画面、DB接続情報を貼らずに、URL、ファイル構成、エラーの出方だけを整理します。
PHPの簡易ルーターについて相談します。
目的:
例: index.php?page=about で about.php を読み込みたい
現在のURL:
例: /index.php?page=about
ファイル構成:
例:
index.php
home.php
about.php
includes/header.php
includes/footer.php
起きている症状:
例: 404になる / 真っ白になる / includeが読み込めない / ローカルだけ動く
確認済みのこと:
- 許可リストに page 名があるか:
- 読み込むPHPファイルが同じ階層にあるか:
- 本番サーバーへアップロード済みか:
- エラーログや画面に出た文:
伏せている情報:
FTP情報、ロリポップ管理画面情報、DB接続情報、APIキー、個人情報
許可リスト、includeパス、404処理、本番アップロード先の順に確認してください。
本番へ上げる前に止まる場所
簡易ルーターは index.php や共通パーツに関わるため、既存サイトへ入れる前に影響範囲を確認します。
| 止まる条件 | 確認すること | 次の行動 |
|---|---|---|
既存の index.php を置き換える | 現在のトップページをバックアップしたか | 修正前バックアップを確認 |
includes/ を読み込む | 本番での相対パスとファイル名の大文字小文字 | includeパス確認へ進む |
| AIが出したコードを貼る | 差分、削除、触ってほしくないファイル、戻し方 | アップロード前チェック |
| URLをきれいにしたい | .htaccess 変更の有無と500になった時の戻し方 | .htaccess 500復旧 |
4. まとめと次のステップ
今回は、URLパラメータとPHPの`include`文を使って、表示するコンテンツを切り替える簡易的なルーティングの仕組みを学びました。`index.php`という一つの入り口が、URLに応じて交通整理を行うことで、Webサイト全体が構成されるという感覚が掴めたでしょうか。
実は、私たちが普段使っているLaravelやSymfonyといったモダンなPHPフレームワークは、このルーティングの仕組みをさらに高度で安全にしたものを提供しています。今回の知識は、そうしたフレームワークがなぜ必要なのか、裏側で何が行われているのかを理解するための重要な基礎となります。
次のステップとしては、`.htaccess`ファイルを使ってURLを書き換え、`index.php?page=about`のようなURLを`/about`のように、より美しく見せる「**プリティURL**」に挑戦してみるのも面白いでしょう。Webの仕組みへの理解がさらに深まるはずです。
レンタルサーバーでルーティングを使う時の注意点
シンプルルーターは便利ですが、ユーザーから受け取った値をそのままファイルパスに使うと危険です。読み込めるページ名を配列で固定し、存在しないページは404として扱います。
- 許可したページ名だけ読み込む
../を含むパスを受け付けない- 共通ヘッダーやフッターは
includesにまとめる - 404ページを用意しておく