.htaccessを使ったwwwなしのドメインへのアクセス制御。※常時SSL設定も

シェアしてもらえたりすると元気出ます。

head

どうも。ケーラボです。

前回はWordPressをサブドメイン型のマルチサイト化する設定をやりました。
今回は、ネイキッドドメインへのアクセスをApacheでルーティングしたいと思います。

はぁ!?知ってるし!ってかたはここでお別れです。ごめんなさい(´・ω・`)ショボン

ネイキッドドメインとは?

「example.com」のようにURLにwwwなどがつかないドメインのことです。

やりたいこと

ブログをone.example.com , two.example.comで運営するから、今はexample.comは使いたくないなー。
example.comにアクセスが来たら、アクセス拒否もしくはone.example.comに飛ばすようにしたい!

条件

・mod_rewriteが使える状態のApache

とりあえずどんな形になったかを書く。

サーバー環境により色々やり方はあると思うのですが、
私はXserverの.htacessファイルを修正してアップロードするかたちにしました。

エックスサーバー
http://www.xserver.ne.jp/
xserver

ドキュメントルートの.htaccessに以下のように記述します。

# BEGIN WordPress

# for multi site  #
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

###### my custom #######

## http -> httpsのリダイレクト
RewriteCond %{HTTPS} off
# httpsでリダイレクト
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
## 【ココ】 example.comは管理者ページのみ表示させてアクセス禁止(403ページ)またはリダイレクト
# 以下の条件以外は、
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteCond %{REQUEST_URI} !^/wp-(content|admin|includes|json).*$ [NC]
RewriteCond %{REQUEST_URI} !^/favicon.ico$ [NC]
RewriteCond %{QUERY_STRING} !(customize_|preview=).*$ [NC]
# すべてのアクセスを403(アクセス禁止)に。
#RewriteRule ^(.*)$ - [F,L]
# リダイレクト no escape 301redirect
RewriteRule ^(.*)$ https://one.fleeker.net [R=301,L]

####### /end my custom #######

# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
# END WordPress
AuthUserFile "/home/klabo/fleeker.net/htpasswd/.htpasswd"
AuthName "Member Site"
AuthType BASIC
require valid-user

WordPressのマルチサイト機能をONにしてあるので色々書いてますが、ポイントは以下です

# 以下の条件以外は、
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
# 管理画面、メディア、外部インクルードファイル用
RewriteCond %{REQUEST_URI} !^/wp-(content|admin|includes|json).*$ [NC]
# ファビコンへのアクセス
RewriteCond %{REQUEST_URI} !^/favicon.ico$ [NC]
# テーマのカスタマイズやプレビュー画面用
RewriteCond %{QUERY_STRING} !(customize_|preview=).*$ [NC]
# リダイレクト no escape 301redirect
RewriteRule ^(.*)$ https://one.example.com [R=301,L]

直後のRewriteRuleが適用されるにはRewriteCondディレクティブの記述してある通過条件が4つ必要だという意味です。

文章で書いてみる。

ホストがexample.comからのアクセスで、かつ、以下のアクセス↓

example.com/wp-content、

example.com/wp-admin、

example.com/wp-includes、

example.com/wp-json、

example.com/favicon.ico、

除外する。

上記以外のexample.comからのすべてのアクセスはone.example.comのトップ画面へ全部飛ばしちゃうよ!

ってことになります。はい、厳密な部分を端折った上になんだかよくわからないですね。

とにかく管理画面周りだけをそのまま表示したかっただけなのに、除外条件が増えてく増えてく汗、表示系は問題ないと思われます。画像のアップロードもできました。

まあリダイレクトしちゃってるから使わないんだけども。
ちなみに、リダイレクトじゃなくてアクセス拒否したい場合は、RewriteRuleのところをこんな感じに書き換えれば良いようです。

# すべてのアクセスを403(アクセス禁止)に。
RewriteRule ^(.*)$ - [F,L]

これが正しいやり方かどうかはさておき、自分のしたいことは実現できました。わーい。

 おまけ:常時SSLの設定も書く

ついでにすべてのネイキッドドメインへのアクセスをhttps化するようにするのも追加しました。

# httpsアクセスがオフのとき
RewriteCond %{HTTPS} off
# httpsで同じアクセス先にリダイレクト
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

この設定は、アナリティクスやSearchConsoleなどのトラッキングツールに影響出るのと、ソース・ファイルにPathを直で書いてる場合などは修正が必要なので、確認が必要です。
こちらが参考になりました。
https://webdesignerwork.jp/ssl-https-wordpress/

設定ミスるとリダイレクトループに入り、画面が表示されなくなるのでお気をつけを。

まとめ

・/wp-admin/へのアクセス以外をまるっとリダイレクトすればいいかと思いきや、結構除外条件があった。

・管理画面を表示するのに色々読み込んでるファイルがあるのだなあと無知を思い知らされる。

とりあえずこれでうまく機能してますが、すべてのWordPress管理の機能を試したわけじゃないので、何か間違い等あれば、指摘していただけるとありがたいです!

以上です。

ここまで読んでいただきありがとうございました。