Basic認証を特定のディレクトリだけにかける方法
2025.07.11

Basic認証を特定のディレクトリだけにかける方法
Basic認証(ベーシック認証)は、ページを開いたときにユーザー名とパスワードの入力を求め、正しい組み合わせを入力した人だけに表示を許可する仕組みです。Webサーバーの設定だけで手軽にアクセス制限をかけられます。
サイト全体ではなく、特定のディレクトリやファイル、URLだけに認証をかけたいケースも多くあります。たとえば、開発中のページや管理者向けの資料だけを保護したいときに有効です。
この記事では、Apacheの.htaccessを使って、Basic認証をかける範囲を絞る方法を解説します。Basic認証の基本は「.htpasswd を使ったベーシック認証の完全ガイド」をご覧ください。
基本の考え方
.htaccessに書いた設定は、その.htaccessを置いたディレクトリと、その下の階層にだけ効力があります。
つまり、制限したいディレクトリの中にだけBasic認証の.htaccessを置けば、ほかのページには影響しません。ファイルやURL単位で絞りたい場合は、.htaccessの中で対象を指定します(手順3)。
手順1:.htpasswdを用意する
まず、ユーザー名と暗号化したパスワードを書いた.htpasswdファイルを作成します。以下のような形式です。
username:$apr1$GHi7...(暗号化されたパスワード)▶ ALTERNATE tools:.htpasswd作成ツールで簡単に生成できます。
.htpasswdは、できるだけ公開ディレクトリ(public_htmlなど)の外に置きましょう。外に置けない場合でも、Apacheの標準設定では「.ht」で始まるファイルはブラウザから見られないようになっています。
手順2:制限したいディレクトリに.htaccessを設置
次に、Basic認証をかけたいディレクトリに、以下の内容で.htaccessを作成して設置します。
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /home/example/.htpasswd
Require valid-userAuthUserFile のパスは、サーバー環境に合わせて変更してください(絶対パスで指定する必要があります)。
手順3:特定のファイル・URLだけに認証をかける
ディレクトリ全体ではなく、特定のファイル(たとえば /private/report.pdf だけ)や特定のURLに認証をかけたい場合は、.htaccessの中で対象を指定します。ここでは、現在主流の Apache 2.4 での書き方を紹介します。
方法1:特定のファイルだけ(<Files>)
ファイル名で指定する、最もシンプルな方法です。対象のファイルがあるディレクトリ(この例では /private/)の.htaccessに書きます。
<Files "report.pdf">
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /home/example/.htpasswd
Require valid-user
</Files>複数のファイルをまとめて指定したい場合は、正規表現が使える <FilesMatch> を使います。次の例は、PDFとZIPのファイルすべてに認証をかけます。
<FilesMatch "\.(pdf|zip)$">
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /home/example/.htpasswd
Require valid-user
</FilesMatch>方法2:特定のURLだけ(<If>)
URLのパスで指定する方法です。サイトのルートにある.htaccessに書けば、どの階層のURLでも指定できます。WordPressの固定ページのように、実際のファイルやディレクトリが存在しないURLにも使えます。
<If "%{REQUEST_URI} =~ m#^/private/report\.pdf$#">
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /home/example/.htpasswd
Require valid-user
</If>m#〜# の中は正規表現です。^ はURLの先頭、$ は末尾を表し、「.」は \. のようにエスケープします。^/private/ のように末尾を指定しなければ、/private/ で始まるURLすべてが対象になります。
方法3:SetEnvIfで条件を付ける
SetEnvIf で条件に合うリクエストに目印(環境変数)を付け、目印があるときだけ認証を求める方法です。条件を複数行で書き足せるので、対象のURLが多い場合に便利です。
SetEnvIf Request_URI "^/private/report\.pdf$" require_auth
SetEnvIf Request_URI "^/docs/" require_auth
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /home/example/.htpasswd
<RequireAny>
<RequireAll>
Require all granted
Require not env require_auth
</RequireAll>
Require valid-user
</RequireAny>「目印が付いていなければ誰でも表示できる」か「正しいユーザーである」のどちらかを満たせば表示を許可する、という意味になります。目印が付いたURLだけ、ユーザー名とパスワードが必要になります。
補足:Apache 2.2 の書き方
古いサーバー(Apache 2.2)では、Order・Allow・Satisfy を使って次のように書きます。Apache 2.4 では非推奨の書き方で、互換用のモジュール(mod_access_compat)が無いと動作しません。2.4の環境では、上の方法1〜3を使ってください。
SetEnvIf Request_URI "/private/report\.pdf$" require_auth
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /home/example/.htpasswd
Require valid-user
Order allow,deny
Allow from env=!require_auth
Satisfy any手順4:ほかの場所に影響が出ていないか確認
- 認証をかけたディレクトリ・ファイル・URLだけで、ユーザー名とパスワードを求められるか
- それ以外のページが、これまでどおり認証なしで表示されるか
- 上の階層(親ディレクトリやルート)の.htaccessに、別の認証設定が残っていないか
ブラウザは一度入力したユーザー名とパスワードを覚えるため、確認はシークレットウィンドウ(プライベートブラウズ)で行うと確実です。
特定のディレクトリだけ認証を外す(除外する)
反対に、サイト全体にBasic認証をかけたうえで、一部のディレクトリだけ誰でも見られるようにしたい場合もあります。外部サービスから呼び出されるAPIや、公開用の画像フォルダなどが代表的な例です。
その場合は、認証を外したいディレクトリに.htaccessを置き、次の1行を書きます。
Require all granted下の階層の.htaccessに書いた Require は、上の階層の Require を置き換えます。そのため、このディレクトリから下だけ認証が不要になります。Apache 2.2 の場合は、代わりに次のように書きます。
Satisfy any
Order allow,deny
Allow from all認証の代わりに、特定のIPアドレスからのアクセスだけを許可する方法もあります。IP制限の書き方は「.htaccessでIP制限をかける方法」、IP制限とBasic認証の組み合わせは「.htaccessで2段階のアクセス制限をかける方法」で解説しています。
WordPressで特定のディレクトリ・ページを保護する
WordPressのサイトでも、同じ方法でBasic認証をかけられます。WordPressが自動で書き換えるのは、ルートの.htaccessの「# BEGIN WordPress」から「# END WordPress」までの間だけです。自分で書く設定は、この範囲の外(上)に書きましょう。
管理画面(wp-admin)を保護する
/wp-admin/ ディレクトリに次の.htaccessを置きます。不正ログインの対策として効果的です。
AuthType Basic
AuthName "Admin Area"
AuthUserFile /home/example/.htpasswd
Require valid-user
<Files "admin-ajax.php">
Require all granted
</Files>admin-ajax.php は、お問い合わせフォームなど、公開ページの機能からも呼び出されるファイルです。ここに認証がかかると訪問者側の機能が動かなくなるため、このファイルだけ除外しています。
ログイン画面(wp-login.php)を保護する
wp-login.php はルートにあるファイルなので、ルートの.htaccessに <Files> で指定します。「# BEGIN WordPress」より上に書いてください。
<Files "wp-login.php">
AuthType Basic
AuthName "Login"
AuthUserFile /home/example/.htpasswd
Require valid-user
</Files>特定の固定ページを保護する
WordPressの固定ページや投稿には、実際のディレクトリがありません。そのため、手順3の方法2(<If>)でURLを指定します。次の例は、/members/ で始まるページすべてに認証をかけます。
<If "%{REQUEST_URI} =~ m#^/members/#">
AuthType Basic
AuthName "Members Only"
AuthUserFile /home/example/.htpasswd
Require valid-user
</If>うまくいかないときの確認ポイント
500エラー(Internal Server Error)になる
- .htaccessの書き間違い(スペルミス、閉じタグの書き忘れなど)がないか
- サーバーの設定で、.htaccessでの認証設定(AllowOverride AuthConfig)が許可されているか
- AuthUserFile のパスが正しいか。.htpasswdが見つからないと、ユーザー名とパスワードを入力した後に500エラーになります
認証画面が表示されない
- ファイル名が「.htaccess」になっているか(先頭のドット、拡張子の付け忘れ・付けすぎ)
- サーバーが.htaccessを読み込む設定(AllowOverride)になっているか
- Webサーバーが Nginx の場合、.htaccessは使えません。Nginxの設定ファイルで auth_basic を指定します
- ブラウザが以前の認証情報を覚えていないか(シークレットウィンドウで確認)
ログアウトできない
Basic認証には、ログアウトの仕組みがありません。ブラウザが認証情報を覚えている間はログインしたままになるため、ブラウザを完全に終了するか、シークレットウィンドウを閉じてください。
HTTPSで使う
Basic認証では、ユーザー名とパスワードが暗号化されずに送られます。HTTPのままだと通信を盗み見られるおそれがあるため、必ずHTTPS(SSL)のサイトで使いましょう。
ブラウザで毎回ユーザー名とパスワードを入力せずにアクセスしたい場合は、URLに埋め込む方法もあります。書き方や注意点は「Basic認証のURL埋め込みとは?ユーザー名とパスワードをURLに入れてアクセスする方法」で解説しています。
まとめ
- Basic認証は、.htaccessを置いたディレクトリとその下の階層にだけ適用される
- 特定のファイルは <Files>、特定のURLは <If> や SetEnvIf で絞り込める
- 一部のディレクトリだけ除外するには、そのディレクトリに Require all granted を書く
- WordPressでは、管理画面・ログイン画面・特定のページをそれぞれ保護できる
- .htpasswdの生成やAuthUserFileのパス確認には、ツールを活用すると便利







