WordPressのシステムアドレスとサイトアドレスについて
WordPressは管理画面から「WordPressアドレス」と「サイトアドレス」を設定できるようになっています。「WordPressアドレス」というのはシステムがインストールされているURLで、サイトアドレスはユーザーがサイトを見たときにフロントページが表示されるURLです。
このように通常は同一URLです。
WordPressのシステム全体をひとつのディレクトリ内に納めることも可能で、その場合は「WordPressアドレス」を変更します。「WordPressアドレス」と「サイトアドレス」を個別に設定することで、管理画面のURLとユーザーがアクセスする画面のURLを分離させることができるのです。
管理画面のドメインが違う場合の問題
多くのサイトは管理画面もユーザー画面も同じドメインで運用します。ところが「管理画面のドメインを別にしたい」というお客様もいらっしゃいます。そのような場合はリバースプロキシというサーバを介することで実現できます。セキュリティレベルの向上や負荷分散などのメリットがありますが、WordPressはリバースプロキシ上で正常動作するようには作られていないため不具合が発生します。
どのような問題が起きるか
サーバ技術者がリバースプロキシを適切に設定し「WordPressアドレス」と「サイトアドレス」のドメインを分離しても、ユーザー画面に出力されるソースコード内のハイパーリンクが「WordPressアドレス」のドメインになってしまいます。つまり、ブラウザのアドレスバーには「サイトアドレス」のドメインが表示される一方で、ソースコードには「WordPressアドレス」のドメインが混ざっている状態となり、これでは管理画面のドメインを隠したつもりがダダ洩れです。
解決策
この問題を解決するため、ユーザー画面側に出力されるハイパーリンクのURLを書き換えるアクションフックを functions.php に追記します。
// ドメインリライト function is_login_page() { return in_array($GLOBALS['pagenow'], array('wp-login.php', 'wp-register.php')); } if(is_admin() === false && is_login_page() === false){ function replace_domain_url($url){ $url = str_replace("●システム側のドメイン●","■ユーザー側のドメイン■",str_replace("href='//●システム側のドメイン●'","href='//■ユーザー側のドメイン■'",str_replace('href="https://●システム側のドメイン●"','href="/"',str_replace('https://●システム側のドメイン●/','/',$url)))); return $url; } function buf_start() { ob_start("replace_domain_url"); } function buf_end() { ob_end_flush(); } add_action('after_setup_theme', 'buf_start'); add_action('shutdown', 'buf_end'); }
ブロックエディタが使えない問題
ユーザー側に出力されるハイパーリンクのドメインをすべて書き換えてひと安心、と思いきや、今度はブロックエディタが正しく機能しないという問題が起こります。これは REST API のURLに起因する不具合なので、次のようなフィルターフックを functions.php に追記します。
// REST APIのURLリライト add_filter( 'rest_url', 'rest_url_replace' ); function rest_url_replace($url){ if (is_admin())$url = str_replace(home_url(), site_url(), $url); return $url; }
運用上の注意
もともとイレギュラーな施策をしているので、これらの手法が万全というわけでもなく、またWordPressのアップデートなどにより予期せぬ不具合が発生する可能性もあります。サイトの運用にあたってはそのあたりのリスクを念頭に日常的な監視が必要になってくるかと思います。