0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

特殊なWebサーバー環境でのWordPressのインストール:診断と解決のプロセス

Posted at

WordPressのインストールは通常、簡単な作業です。しかし、企業レベルのWebサーバー環境では、CDNやプロキシサーバーが絡むことで予想外の問題が発生することがあります。

今回は、実際に遭遇したAkamai CDN環境でのWordPressインストール問題と、それを診断・解決するプロセスを詳しく紹介します。

発生した問題

症状

  • WordPressインストール先:https://example.com/subdirectory/wp/
  • 内部ネットワークからのアクセス:正常に表示
  • 外部ネットワークからのアクセスERR_TOO_MANY_REDIRECTSエラー

このような症状は、プロキシやCDN環境でよく見られる典型的な問題です。

初期の推測

リダイレクトループが発生していることから、以下を疑いました:

  1. HTTPS/HTTP判定の問題
  2. wp-config.phpのURL設定不備
  3. .htaccessファイルの設定競合

診断アプローチ:環境の可視化

debug-headers.phpの作成

問題の根本原因を特定するため、サーバー環境を詳しく調査できる診断ファイルを作成しました:

<?php
/**
 * サーバー環境診断ファイル
 */
echo "<h1>サーバーヘッダー診断</h1>";
echo "<h2>アクセス元: " . $_SERVER['REMOTE_ADDR'] . "</h2>";

// 重要なサーバー変数を表示
$important_vars = [
    'HTTP_HOST',
    'HTTP_X_FORWARDED_HOST',
    'HTTP_X_FORWARDED_PROTO', 
    'HTTP_X_FORWARDED_FOR',
    'HTTPS',
    'SERVER_PORT',
    'REQUEST_URI'
];

echo "<table border='1'>";
foreach ($important_vars as $var) {
    $value = isset($_SERVER[$var]) ? $_SERVER[$var] : '(未設定)';
    echo "<tr><td>{$var}</td><td>" . htmlspecialchars($value) . "</td></tr>";
}
echo "</table>";

// すべてのHTTPヘッダーを表示
echo "<h3>すべてのHTTPヘッダー</h3>";
foreach ($_SERVER as $key => $value) {
    if (strpos($key, 'HTTP_') === 0) {
        echo "<tr><td>{$key}</td><td>" . htmlspecialchars($value) . "</td></tr>";
    }
}
?>

診断結果の比較

内部アクセス時:

HTTP_HOST: 192.168.1.100
HTTP_X_FORWARDED_HOST: example.com
HTTP_X_FORWARDED_PROTO: (未設定)
HTTP_X_FORWARDED_FOR: 192.168.1.200
HTTPS: (未設定)
SERVER_PORT: 80

外部アクセス時:

HTTP_HOST: 192.168.1.100  
HTTP_X_FORWARDED_HOST: example.com
HTTP_X_FORWARDED_PROTO: (未設定)  ← ここが問題
HTTP_VIA: 1.1 v1-akamaitech.net(ghost) ← Akamai CDNの証拠
HTTPS: (未設定)
SERVER_PORT: 80

問題の特定

診断結果から以下の問題が明確になりました:

1. Akamai CDN特有の問題

HTTP_VIAヘッダーから、このサイトがAkamai CDNを使用していることが判明。Akamai CDNはX-Forwarded-Protoヘッダーを送信しないため、WordPressがHTTP環境だと誤認識していました。

2. HTTPS判定の失敗

  • 実際の接続:ユーザー → CDN(HTTPS)→ サーバー(HTTP)
  • WordPressの認識:HTTP環境
  • 結果:HTTPS URLへの無限リダイレクト

解決策:環境に特化したwp-config.php

CDN環境の検出とHTTPS強制

// CDN・プロキシ経由の検出
if (isset($_SERVER['HTTP_X_FORWARDED_HOST']) || isset($_SERVER['HTTP_VIA'])) {
    // プロキシ・CDN経由の場合はHTTPS前提で処理
    $_SERVER['HTTPS'] = 'on';
    $_SERVER['SERVER_PORT'] = 443;
    $_ENV['HTTPS'] = 'on';
}

ホスト名の正規化

// 正しいホスト名の設定
if (isset($_SERVER['HTTP_X_FORWARDED_HOST']) && !empty($_SERVER['HTTP_X_FORWARDED_HOST'])) {
    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}

WordPressのURL明示

// URL設定の明示(自動検出に頼らない)
define('WP_HOME', 'https://example.com/subdirectory/wp/');
define('WP_SITEURL', 'https://example.com/subdirectory/wp/');
define('WP_CONTENT_URL', 'https://example.com/subdirectory/wp/wp-content');
define('WP_CONTENT_DIR', '/var/www/html/subdirectory/wp/wp-content');

検証と結果

修正後、以下の検証を行いました:

  1. 内部ネットワークからのアクセス:正常動作を継続
  2. 外部ネットワークからのアクセス:エラー解消、正常表示
  3. 管理画面アクセス:HTTPS強制が正常に動作

学んだ教訓とベストプラクティス

1. 環境診断の重要性

必ず実施すべき手順:

  • 診断ファイルによるヘッダー情報の確認
  • 内部・外部からの両方でのテスト
  • CDN/プロキシの種類の特定

2. 環境別の対応パターン

今回はAkamai CDNでしたが、他の環境では異なる対応が必要です:

Cloudflare CDN:

if (isset($_SERVER['HTTP_CF_VISITOR'])) {
    $cf_visitor = json_decode($_SERVER['HTTP_CF_VISITOR'], true);
    if ($cf_visitor['scheme'] === 'https') {
        $_SERVER['HTTPS'] = 'on';
    }
}

AWS CloudFront:

if (isset($_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO']) && 
    $_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

3. 汎用的な診断フレームワーク

// 段階的な診断アプローチ
function detectCDNEnvironment() {
    // 1. CDN固有のヘッダーをチェック
    if (isset($_SERVER['HTTP_VIA']) && strpos($_SERVER['HTTP_VIA'], 'akamai') !== false) {
        return 'akamai';
    }
    if (isset($_SERVER['HTTP_CF_RAY'])) {
        return 'cloudflare';
    }
    if (isset($_SERVER['HTTP_X_AMZ_CF_ID'])) {
        return 'aws_cloudfront';
    }
    
    // 2. 標準的なプロキシヘッダーをチェック
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        return 'proxy';
    }
    
    return 'direct';
}

まとめ

特殊なWebサーバー環境でのWordPressインストールでは、以下のアプローチが有効です:

問題解決のプロセス

  1. 症状の詳細な観察(内部・外部アクセスの差異)
  2. 環境の診断(ヘッダー情報の詳細分析)
  3. CDN/プロキシの特定(環境に特化した対応の選択)
  4. 段階的な修正(設定変更の効果を一つずつ確認)
  5. 包括的な検証(複数の環境でのテスト)

重要なポイント

  • 標準的な設定では解決できない場合がある
  • 環境診断が問題解決の鍵
  • CDN/プロキシごとに異なる対応が必要
  • 診断ファイルは問題解決の強力なツール

現代のWebサイトでは、高速化やセキュリティのためにCDNやプロキシが標準的に使用されています。このような環境でWordPressを構築する際は、今回紹介した診断・解決プロセスが役立つでしょう。

何より重要なのは、「なぜ問題が起きているのか」を正確に把握することです。症状だけでなく、環境の特性を理解することで、根本的で確実な解決策を見つけることができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?