WordPressの前にリバースプロキシを配置すると以下のようなエラーが発生する場合がある。
- ERR_TOO_MANY_REDIRECTS (リダイレクトの回数が多すぎる)
- 504 Gateway Timeout (時間切れ)
解決するのに苦労したので原理から解決策を記載する。他のサイトでも部分的には説明されているが、体系的に理解できるものが見つからなかったので体系的にまとめることにした。
この問題で困っている人は大変かもしれないが根本の原理から理解して対応することをお勧めする。残念ながら下記のとおり複雑なのでネット情報で取り敢えずやってみるというのは泥沼にハマるので注意してほしい。
エラーの原因
エラーが発生する原因はWordpressのリダイレクト機能にある。通常は下記の図のとおりWEBサーバーはユーザーにアドレスが間違っているから正しいアドレスにアクセスするように依頼する便利な機能である。
しかし、WEBサーバーの前にリバースプロキシが存在する等、特定の条件が重なる場合に上記のエラーが発生するが、複数のパターンがあり、問題を複雑化している。下記のとおり私がハマったパターンを記載する。
パターン1:HTTP→HTTPSへのアドレス変換時のリダイレクトでエラー
下記図のように設定で登録されたサイトアドレスがhttpsでアクセスしてきたアドレスがhttpだとwordpressは安全のために、httpsにアクセスするようにリダイレクト先(https)をユーザーに戻す。しかし、リバースプロキシ<—>wordpressの通信は内部ネットワークであることからhttpで行われ、wordpressは、再度、リダイレクト先をユーザーに戻してしまう。このループによりエラーが発生する。
パターン2:利便性のためにアドレス変換のリダイレクトでエラー(タイムアウト)
テーマによっては誤ったアドレスでアクセスした場合に自動でTOPページ等にリダイレクトさせる機能がある。ポートが指定されているとこの機能によりリダイレクト先(ポートを排除したアドレス)がユーザーに戻される。ユーザーはリダイレクト先のポート指定なしのアドレスに接続するが当然、ポートが空いていないのでエラーとなる。
解決策
パターン1の場合
下記のようにwpコマンドでサイトアドレスとwordpressアドレスを設定する。
wpコマンドのインストール
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
コマンド実行
wp option update home ‘https://ex.com’ –allow-root
wp option update siteurl ‘https://ex.com’ –allow-root
パターン2の場合
下記をfunction.phpの先頭に追記することでリダイレクト機能をオフにする。
remove_action('template_redirect','redirect_canonical');
その他
実際にはエラーメッセージは上記のみでなく様々なパターンが有り得る。例えば、パターン2の場合は、リバースプロキシの前にFWがある場合とない場合はではメッセージは変る可能性がある。
上記、パターン1、2が混在する場合もあれば、Apacheの設定等の他のリダイレクト関連のエラーも有り得る。まずは、一旦、全てのリダイレクト機能をOFFにして1つずつONにして問題の発生原因を特定した方がよいかもしれない。