【PHP】Docker環境でPHPのリダイレクトを学ぶ:初心者向けハンズオン・ガイド

PHPのリダイレクトの重要性

PHPでのリダイレクトは、Webアプリケーション開発において非常に重要な機能です。

  • ユーザーを適切なページに自動的に誘導することで、スムーズなナビゲーションを提供します。
  • エラーページや存在しないページへのアクセスを適切に処理できます。
  • URLが変更された際に、古いURLから新しいURLへのリダイレクトを設定できます。
  • 認証されていないユーザーを適切に制限されたエリアから排除できます。
  • フォーム送信後の適切なページへの誘導など、アプリケーションの流れを制御できます。

ファイル構成

php-redirect-demo/
│
├── Dockerfile
├── docker-compose.yml
│
└── src/
    ├── index.php
    ├── basic_redirect.php
    ├── conditional_redirect.php
    ├── status_redirect.php
    └── redirect_with_data.php

Dockerfile

FROM php:7.4-apache

COPY . /var/www/html/

docker-compose.yml

version: '3'

services:
  web:
    build: .
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html

index.php

<!DOCTYPE html>
<html>
<head>
    <title>PHP Redirect Demo</title>
</head>
<body>
    <h1>PHP Redirect Demo</h1>
    <ul>
        <li><a href="basic_redirect.php">Basic Redirect</a></li>
        <li><a href="conditional_redirect.php">Conditional Redirect</a></li>
        <li><a href="status_redirect.php">Status Code Redirect</a></li>
        <li><a href="redirect_with_data.php">Redirect with Data</a></li>
    </ul>
</body>
</html>

index.php

<!DOCTYPE html>
<html>
<head>
    <title>PHP Redirect Demo</title>
</head>
<body>
    <h1>PHP Redirect Demo</h1>
    <ul>
        <li><a href="basic_redirect.php">Basic Redirect</a></li>
        <li><a href="conditional_redirect.php">Conditional Redirect</a></li>
        <li><a href="status_redirect.php">Status Code Redirect</a></li>
        <li><a href="redirect_with_data.php">Redirect with Data</a></li>
    </ul>
</body>
</html>

basic_redirect.php

このリダイレクトは302(一時的なリダイレクト)として扱われます。

<?php
$redirect_url = 'https://www.example.com';
header('Location: ' . $redirect_url);
exit;
?>

1)HTTPヘッダーに「header(‘Location: ‘ [リダイレクト先のURL]);」という内容のヘッダー文字列が設定されます。

※ヘッダー文字列は、HTTPリクエストやレスポンスの一部として送信される、キーと値のペアで構成されたテキスト情報です

2)ブラウザがこのPHPファイルにアクセスすると、サーバーはLocationヘッダーを含むHTTPレスポンスを返します。 ブラウザはこのヘッダーを受け取ると、指定されたURLに自動的にリダイレクトします。

クライアント (ブラウザ)                 サーバー (PHP)
         |                                    |
         |   1. HTTPリクエスト                |
         | --------------------------->       |
         |                                    |
         |                              2. PHPスクリプト実行
         |                                    |
         |                              header('Location: https://example.com');
         |                                    |
         |   3. HTTPレスポンス                |
         |      ステータスコード: 302         |
         |      Location: https://example.com |
         | <---------------------------       |
         |                                    |
  4. 新しいURLへリダイレクト                  |
         |                                    |
         |   5. 新しいURLへのリクエスト       |
         | --------------------------->       |
         |                                    |
                以降、新しいURLでの通信が続く

使用例:

  • ユーザーを外部サイトにリダイレクトする場合
  • ログイン後にユーザーをダッシュボードにリダイレクトする場合
  • 古いURLから新しいURLへのリダイレクト

conditional_redirect.php(条件付きリダイレクト)

<?php
$user_logged_in = false;

if (!$user_logged_in) {
    header('Location: index.php');
    exit;
} else {
    echo "Welcome, logged-in user!";
}
?>

status_redirect.php(ステータスコード301(恒久的に移動))

HTTP/1.1プロトコルを使用し、ステータスコード301(恒久的に移動)を設定しています

<?php
$redirect_url = 'index.php';
header('HTTP/1.1 301 Moved Permanently'); // 301 Moved Permanently ステータスコードを送信
header('Location: ' . $redirect_url);
exit;
?>

使用シナリオ:

  • ウェブサイトの構造変更時
  • ドメイン変更時
  • 古いURLを新しいURLに恒久的に置き換える場合
302 Found (デフォルト)301 Moved Permanently
一時的な移動301 Moved Permanently
SEO影響少SEO影響大
通常キャッシュされない

302は一時的なリダイレクトを意味するため、
ブラウザはこれを永続的に記憶しません。
長期間キャッシュされる可能性が高い

redirect_with_data.php(リダイレクト時にデータを送信する)

<?php
$username = "JohnDoe";
$redirect_url = 'index.php?user=' . urlencode($username);
header('Location: ' . $redirect_url);
exit;
?>

データの送信方法:

  • クエリパラメータ(GET方式)を使用してデータを送信しています。
  • URLの一部としてデータが送信されるため、ブラウザのアドレスバーに表示されます。

URLエンコーディング:

  • urlencode() 関数を使用して、特殊文字や空白を安全にエンコードします。
  • これにより、データに含まれる特殊文字がURLの構造を壊すことを防ぎます。

セキュリティ考慮事項:

  • 機密情報をこの方法で送信することは避けるべきです。
  • GETパラメータはブラウザの履歴やサーバーログに残る可能性があります。

データ量の制限:

  • URLの長さには制限があるため、大量のデータを送信する場合は適していません。

使用シナリオ:

  • ユーザー認証後の歓迎ページへのリダイレクト
  • 検索結果ページへのリダイレクト
  • エラーメッセージを含むページへのリダイレクト

複数ヘッダーを渡す

リプレイス、上書きの許可

true

JSONを出力する際