ワードプレスでマルチサイトを構築している場合、特定の子サイトにだけBasic認証をかけるにはちょっとした工夫が必要になります。
マルチサイトではサブディレクトリは存在しないため、ディレクトリに.htaccessを置くことができず、ルートに置いた.htaccessで対処しなくてはいけません。
単に子サイトをパスワード保護するだけであればプラグインを使って設定することもできますが、ここではルートの.htaccessで特定の子サイトにだけBasic認証をかける方法を紹介します。
1:<If>文を使って認証サイトを特定する(Apache2.4~
Apacheのバージョンが2.4以降ならIf文が使えます。
サブドメイン方式のマルチサイトで認証をかけるサイトがひとつなら、<If>文で書いてしまうのが便利です。
以下の場合は、www.sample.comのみ認証がかかります。
※ドメインやディレクトリ構成は仮のものですので、ご自身の環境におきかえて下さい。
<If "%{HTTP_HOST} == 'www.sample.com'">
AuthUserFile /home/example.com/some/directory/.htpasswd
AuthName "Please enter your ID and password"
AuthType Basic
Require valid-user
</If>
2:<If>文を使って認証サイトを除外する(Apache2.4~
if分の条件式には否定も使えますので、特定サイトのみ公開したい場合は以下のように書けます。
以下の場合は、www.sample.com以外のサイトに認証がかかり、www.sample.comは認証なしでアクセスすることができます。
<If "%{HTTP_HOST} != 'www.sample.com'">
AuthUserFile /home/example.com/some/directory/.htpasswd
AuthName "Please enter your ID and password"
AuthType Basic
Require valid-user
</If>
If文では様々な比較や複数の条件式、正規表現なども使えますので、複数サイトを記載したい場合はこれらを組み合わせて記述していきます。
3:SetEnvIfを使って認証を外したいサイトを追記していく
認証を外したいサイトが複数の場合、SetEnvIfで環境変数を割り当てることもできます。
以下の場合、no_authを付与したサイト以外のサイトに認証がかかります。
# ホスト設定 - 認証を外したいサイトを列挙
SetEnvIf Host "^example.com$" no_auth
SetEnvIf Host "^www.example.com$" no_auth
SetEnvIf Host "^sub.example.com$" no_auth
# アクセス制限
Satisfy Any
AuthUserFile /home/example.com/some/directory/.htpasswd
AuthName "Please enter your ID and password"
AuthType Basic
Require valid-user
Order Deny,Allow
Deny from all
Allow from env=no_auth
サンプル:特定サイトに認証をかけ、WPの管理画面には全サイトで認証をかける
上記を組み合わせると、色々な条件を記載することができるようになります。
以下では、特定サイトにBasic認証をかけた上で、WordPressの管理画面へは全サイトで認証が必要になります。
# ホスト設定 - 認証サイト
SetEnvIf Host "auth.example.com$" auth
# Basic認証 - auth.sample.comのみ
<If "%{HTTP_HOST} == 'auth.sample.com'">
AuthUserFile /home/example.com/some/directory/.htpasswd
AuthName "Please enter your ID and password"
AuthType Basic
Require valid-user
</If>
# Basic認証 - WordPressのログイン画面:全サイトで認証
<Files "wp-login.php">
Satisfy Any
AuthUserFile /home/example.com/some/directory/.htpasswd
AuthName "Please enter your ID and password"
AuthType Basic
Require valid-user
Order Deny,Allow
Deny from all
Allow from env=auth
</Files>
ポイントは、SetEnvIfで認証が必要なサイトにauth変数を付与していることとSatisfy Anyです。
まず、If文でauth.sample.com全体に認証がかかります。
そのままだと、auth.sample.comの管理画面にアクセスした時に<Files>の認証もかかってしまい、2重認証になる上に正しくログインできません。
そこで、SetEnvIfを使ってauth.sample.comを<Files>の認証から外しています。
まとめ
.htaccessでは、このほかにも色々な記述ができます。環境に合わせて書き変えてみてください。
コメント