問題
- ローカルで WordPress を Docker で構築した
- 使ったイメージは ここ のDocker Official
- ページに記載されている通り
-p 8080:80のポート割り当てで起動
- この時点で初回の検証をする場合は特に問題は起きなかった
- 改めて起動して
http://localhost:8080にアクセスすると、http://localhostにリダイレクトされてアクセスできない - WordPressコンテナを落として次の日、WordPress 以外のアプリケーション開発で
http://localhost:8080にアクセスするとhttp://localhostの表示となり、8080にアクセスできていないように見える- ただし、
/以外 (http://localhost:8080/loginなど ) にアクセスはできる
- ただし、
- curl などでは普通に
http://localhost:8080へはアクセスできる
この問題の原因を探る。
調査結果
- WordPress の
homeおよびsiteurlはコンテナ内部のポートに依存した初期設定が行われるので、http://localhostで初期データが作成される- どうも WordPress ではアクセスしてきたドメインと
wp_options.homeに登録されているドメインが違う場合、homeのドメインに 301リダイレクトが発生する……らしい。- なんでこんな機能があるんだろう…、リバプロとかすごく挟みづらそう…
- どうも WordPress ではアクセスしてきたドメインと
- そのため、この状態のWordPressが動作している状態で
http://localhost:8080にアクセスすると、http://localhostに 301 リダイレクトされる - そして ブラウザでは 301 リダイレクトもキャッシュする
- ので、キャッシュが残っている間は
http://localhost:8080へのアクセスを行うと、一瞬でリダイレクトされるのでhttp://localhost:8080に対してアクセスができないように見える
解決策
- ブラウザのキャッシュをクリアする
- WordPressが利用するDataBase の
homeおよびsiteurlをhttp://localhost:8080に書き換える- ただし、WordPress 内部から home および siteurl を参照して自分自身にアクセスするような場合、
http://localhost:8080はコンテナ内部で閉じているので動かない - サンプルには
-p 8080:80と書いてあるが、もう複雑すぎるので-p 80:80以外で動かさない方がいいんじゃないかな? - もしくは、そもそもローカルで構築せずにグローバルなFQDNを割り当ててそれで外中両方のアクセスを適切に解決できるようにすればよい
- ただし、WordPress 内部から home および siteurl を参照して自分自身にアクセスするような場合、
参考
というか同様のトラブルにハマった方の記事。
余談
WordPress、システムを管理する側から見るとものすごくハマりどころが多い印象でつらい。