【WordPress】マルチサイトの子サイトだけをBasic認証でパスワード保護する方法

Wordpress

ワードプレスでマルチサイトを構築している場合、特定の子サイトにだけ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>

<If [expression]>: [expression]の条件を満たした場合のみ実行

※Apache2.4以降でのみ使用可能

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

SetEnvIf:条件にあった場合に変数を定義する。

サンプル:特定サイトに認証をかけ、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です。

Satisfy Any:いずれかの条件が通れば良い。

まず、If文でauth.sample.com全体に認証がかかります。

そのままだと、auth.sample.comの管理画面にアクセスした時に<Files>の認証もかかってしまい、2重認証になる上に正しくログインできません。

そこで、SetEnvIfを使ってauth.sample.comを<Files>の認証から外しています。

まとめ

.htaccessでは、このほかにも色々な記述ができます。環境に合わせて書き変えてみてください。

コメント

タイトルとURLをコピーしました