wordpressでbasic認証をファイルとディレクトリに設定

wordpressでbasic認証をファイルとフォルダにかける方法としては、「.htaccess」を直接弄るか、ファイル単位でも指定できるwordpressプラグインを作成するといったことがあげられます。レンタルサーバでも管理パネルから設定できますが、大抵ディレクトリ単位となっていて、ファイル単位では指定できないようです。

basic認証の書式

「AuthType BASIC」は、Basic認証をしています。「AuthName "wordpress site"」は、ダイアログボックスに表示される文字列です。日本語だと大抵文字化けします。「AuthUserFile "/full path/.htpasswd"」は、IDとハッシュ化されたパスワードを保存しているファイルの場所で、サーバ内のスラッシュから始まるフルパスで指定します。「require valid-user」は、全てのユーザーに対してBasic認証を実施するという意味です。他に「AuthGroupfile /dev/null」の指定もありますが、無くても動作します。この設定は、グループファイルを使う時に使います。

AuthType BASIC
AuthName "wordpress site"
AuthUserFile "/full path/.htpasswd"
require valid-user

wordpressでファイルにbasic認証をかけるには?

対象となるページをグループ化して指定できます。

<Files ~ (wordpress_1|wordpress_2)\.html>
AuthType BASIC
AuthName "wordpress site"
AuthUserFile "/full path/.htpasswd"
require valid-user
</Files>

wordpressでディレクトリにbasic認証をかけるには?

wordpressはシステムでは、存在しないディレクトリを作成するため、わざと実在させて「.htaccess」を設置するという方法もありますが、無駄な作業が増えるため、この記事では省きます。といってもディレクトリごとに上記の設定で「.htaccess」を設置すれば良いだけの話ですが。

話を戻します。「.htaccess」ではDirectoryディレクティブとLocationディレクティブは利用できないため、ディレクトリにはSetEnvIfを使います。これらのディレクティブはサーバ管理者側のhttpd.confでのみ使えます。

下のコードにあるSatisfy Anyはどこに記述しても構いません。また、どれか一つが通ればアクセスできるという意味あり、これに対してSatisfy Allはすべての条件が通らないとアクセスできないという意味になります。デフォルトでは後者の設定になっています。

Satisfy Anyでは、他にIP制限などを設けていると、そちらのほうで条件が通ってしまうこともあります。ハマると正常動作していないように見えるため、考えすぎてもだえ苦しみます。以下のSetEnvIf Request_URIは三パターンの内、二つをコメントアウトしていますが、いずれも動作します。複数のディレクトリを指定する場合は、「SetEnvIf Request_URI "^(/wp01/|/wp02/)" wordpress_directory」の書式にします。

AuthType BASIC
AuthName "wordpress site"
AuthUserFile "/full path/.htpasswd"
require valid-user
Satisfy Any
#SetEnvIf Request_URI "^(/wp01/|/wp02/)" wordpress_directory
#SetEnvIf Request_URI "^(/wp01/)" wordpress_directory
SetEnvIf Request_URI "^/wp01/" wordpress_directory
Order Allow,Deny
Allow from all
Deny from env=wordpress_directory

「.htaccess」での拒否と許可

全てを許可

order deny,allow

全て拒否

Order Allow,Deny

全てを許可

Allow from all

全て拒否

Deny from all

全てを許可して拒否し、x~、y~のIPアドレスを許可。「order deny,allow」は無くても構いませんが、このような書式が慣習的に好まれているようです。

order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx
allow from yyy.yyy.yyy.yyy

全てを許可し、x~のみ拒否。order allow,denyを入れる人もいます。

allow from all
deny from xxx.xxx.xxx.xxx

「.htpasswd」

htpasswdは、basic認証でログインする際に入力するユーザー名とパスワードを設定するファイルのことです。中身は、以下のような書式でユーザーごとに一行ずつ追加していきます。パスワードはハッシュ化されますが、password_hashやcrypt関数の単方向のアルゴリズムで作られるため、復号する関数はありません。つまり、元のパスワードを復元する関数は存在しません。利用するには、このファイルをサーバ内にアップロードし、「.htaccess」のbasic認証のAuthUserFileにサーバ内のスラッシュから始まるフルパスで指定します。また、ハッシュ化はこのページの上部にあるフォームでIDとパスワードを入力して作成すると簡単に出来上がります。作成するたびに値が変化します。

ちなみにhtpasswdはたまたまこの名称を使っているだけで、本来は他の名称でも使えます。しかし、httpd.confで初めから設定されている場合は、その設定が無効になるため、慣習的に使われているhtpasswdの名称をそのままにしておいたほうが無難です。

# htpasswdの記述例
user:$1$ER0fve7x$2Qh/XwVV87zjzDt3N4Xyh1

以下のようにすると「.ht」のつくファイルに対してアクセスを拒否できますが、大抵のレンタルサーバではhttpd.confなどで初めから設定されています。また、他にアクセスさせたくないファイルがあれば、この方法を応用してアクセスを拒否できます。

<Files ~ "^\.ht">
deny from all
</Files>

まとめ

basic認証は何もwordpressに限ったことではありませんが、wordpressのカテゴリーなどではディレクトリを実在させない形でURLを生成します。そのため、簡単にbasic認証をさせようと思ったら、わざわざディレクトリを作成しなければならないなんていう二度手間が発生してしまうんですよ。筆者の場合は、ルートディレクトリの「.htaccess」一つで全てのフォルダを操作したい派です。「.htaccess」は作りすぎるとややこしくなりますし、ましてwordpressはURLの構築時にフォルダを実在させないのですから、ただでも「.htaccess」ファイルが増えすぎて混乱する増えに、フォルダまでその混乱に参加してくるとなると、もうどこに何を置いているのか分からなくなります。記事としてまとめて、とりあえずスッキリさせて頂きました。ディレクトリに関しては、SetEnvIfを使えば解決します。ファイルに関してはFilesディレクティブで解決します。