WordPressのインストールは通常、簡単な作業です。しかし、企業レベルのWebサーバー環境では、CDNやプロキシサーバーが絡むことで予想外の問題が発生することがあります。
今回は、実際に遭遇したAkamai CDN環境でのWordPressインストール問題と、それを診断・解決するプロセスを詳しく紹介します。
発生した問題
症状
- WordPressインストール先:
https://example.com/subdirectory/wp/
- 内部ネットワークからのアクセス:正常に表示
-
外部ネットワークからのアクセス:
ERR_TOO_MANY_REDIRECTS
エラー
このような症状は、プロキシやCDN環境でよく見られる典型的な問題です。
初期の推測
リダイレクトループが発生していることから、以下を疑いました:
- HTTPS/HTTP判定の問題
- wp-config.phpのURL設定不備
- .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');
検証と結果
修正後、以下の検証を行いました:
- 内部ネットワークからのアクセス:正常動作を継続
- 外部ネットワークからのアクセス:エラー解消、正常表示
- 管理画面アクセス: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インストールでは、以下のアプローチが有効です:
問題解決のプロセス
- 症状の詳細な観察(内部・外部アクセスの差異)
- 環境の診断(ヘッダー情報の詳細分析)
- CDN/プロキシの特定(環境に特化した対応の選択)
- 段階的な修正(設定変更の効果を一つずつ確認)
- 包括的な検証(複数の環境でのテスト)
重要なポイント
- 標準的な設定では解決できない場合がある
- 環境診断が問題解決の鍵
- CDN/プロキシごとに異なる対応が必要
- 診断ファイルは問題解決の強力なツール
現代のWebサイトでは、高速化やセキュリティのためにCDNやプロキシが標準的に使用されています。このような環境でWordPressを構築する際は、今回紹介した診断・解決プロセスが役立つでしょう。
何より重要なのは、「なぜ問題が起きているのか」を正確に把握することです。症状だけでなく、環境の特性を理解することで、根本的で確実な解決策を見つけることができます。