この記事は技術書典5で作成した本の内容を抜粋したものです。
やりたいこと
- wordpressの閲覧URLと管理URLで異なるホストを設定する
- セキュリティ的にホストから分けて、管理側に制限かけたいため
- AWS上のEC2で設定する
※ manage.example.com、blog.example.com は実際に使用するURLに置き換えてください
準備
KUSANAGI for AWSを利用する
https://kusanagi.tokyo/cloud/kusanagi-for-aws/
管理URL設定
- ALBを設定する
- リスナーはHTTP,HTTPS。ターゲットにwordpressのEC2
- 管理画面へアクセス可能なIPだけを設定する
- Route53を設定する
- 管理URL(manage.example.com)レコードを作成し、Alias Targetに作成したALBを設定する
- 準備した KUSANAGIのEC2にログインし、管理側のURL(manage.example.com)で初期設定を行う
- KUSANAGIの初期設定 https://kusanagi.tokyo/document/kusanagi-init/
この段階で、設定したIPだけ管理用URLで、wordpressにアクセスできる状態になります。
管理URLのSSL化を行う
現在の設定だと無限ループするので、こちら参考
https://qiita.com/backgroundcolor/items/22ff275d0e82d4e5edd7
閲覧URL設定
- ALBを設定する
- リスナーはHTTP,HTTPS。ターゲットにwordpressのEC2
- IP制限なし
- Route53を設定する
- 閲覧URL(blog.example.com)レコードを作成し、Alias Targetに作成したALBを設定する
- WordPressのサイトアドレスを設定
- WordPressの管理画面( https://manage.example.com )にログインし、サイトアドレス (URL)を blog.example.com に変更
wp-config.phpで変更も可
define('WP_SITEURL','https://blog.example.com');
nginxの設定
- nginxの設定ファイルを閲覧URL用にコピー
$ cd /etc/nginx/conf.d/
$ sudo cp xxxx_http.conf xxxx_blog_http.conf
- 閲覧URL用の設定ファイル(xxxx_blog_http.conf)を開き3箇所修正
server_name blog.example.com;
#rewrite /wp-admin$ $scheme://$host$uri/ permanent;
location ~* /wp-login\.php|/wp-admin/((?!(admin-ajax\.php|images/)).)*$ {
return 404;
}
- nginxを再起動し、blog.example.com でアクセスできることを確認
- 閲覧URLでは管理画面(blog.example.com/wp-admin)が404になることも確認
$ sudo kusanagi nginx
WordPressの設定変更
この段階ではテンプレートで埋め込まれるURLが管理URLとなったままなので
管理URL -> 閲覧URLに置換するため
テーマファイルのfunction.phpに追記します。
function replace_site_url($url){
return str_replace(site_url(), home_url(), $url);
};
add_filter('includes_url', 'replace_site_url');
add_filter('content_url', 'replace_site_url');
add_filter('script_loader_src', 'replace_site_url');
add_filter('get_search_form', 'replace_site_url');
add_filter('get_the_guid', 'replace_site_url');
add_filter('wp_calculate_image_srcset_meta', '__return_false');
add_filter('comments_open', '__return_false');
add_filter('pings_open', '__return_false');
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wp_generator');
// 画像パス変更
add_filter('wp_get_attachment_url', function ($url){
if (preg_match('/^http(s)?:\/\/[^\/\s]+(.*)$/', $url, $match)) {
$url = $match[2];
}
return $url;
});
以上で設定完了です
2020.04.27 追記
上記の設定をしていると、 ver5以上のwordpressの投稿画面でエラーとなるようなので、対策を追記した
wordpressの管理と公開で異なるドメインにしたらWP REST APIがエラーになる場合の対処
https://qiita.com/backgroundcolor/items/6e925625ccb843de4342