0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WordPressで複数のBasic認証を設定したときのハマりポイントと対処法【備忘録】

Last updated at Posted at 2025-06-29

🔰 はじめに

はじめまして。
中途・未経験からエンジニアになり、現在3年目です。Javaでの開発を主に担当しており、PHPはこれまで触ったことがありませんでした。

そんな私が、ある案件で WordPress を使用したサイト構築を担当することになりました。
特定の事情により、Basic認証を「ログインページ」と「記事ページ」でそれぞれ設定する構成が求められました

今回はその中でハマった点と、最終的な解決方法をまとめておきます。
珍しいケースかもしれませんが、どこかの誰かの参考になれば幸いです。

※なお、ユーザー名やファイルパスなどは実際のものではなく、わかりやすくするためにサンプルに置き換えています。


🛠 やりたかったこと

  • WordPress のログインページに Basic認証をかけたい(管理者向け)
  • 記事ページにも別途 Basic認証をかけたい(ユーザー向け)

つまり、ログインページと記事ページにそれぞれ別のBasic認証を設定する構成です。


🗂 最初の構成(失敗したパターン)

WordPressのディレクトリ直下に .htaccess.htpasswd をそれぞれ2種類ずつ作成し、以下のように設定しました。

.htaccess

<FilesMatch "^(?!wp-login\.php)">
  Order allow,deny
  Allow from all
  AuthType Basic
  AuthName "auth"
  AuthUserFile C:/xampp/htdocs/wordpress/pass1/.htpasswd
  require valid-user
</FilesMatch>

<FilesMatch wp-login.php>
  Order allow,deny
  Allow from all
  AuthType Basic
  AuthName "auth"
  AuthUserFile C:/xampp/htdocs/wordpress/pass2/.htpasswd
  require valid-user
</FilesMatch>

.htpasswd を2ファイル作成し、異なるパスワードを設定。

1つ目(pass1)は ログインページ以外(記事ページ)に対してBasic認証を設定。
2つ目(pass2)は ログインページに対してBasic認証を設定。

結果

最初のアクセスでは想定通りBasic認証が表示されました。

スクリーンショット 2025-06-29 190037.png

ユーザー名とパスワードを入力してログインを試みます。

スクリーンショット 2025-06-29 205016.png

認証後、もう一度Basic認証が表示されてしまいました。↓

スクリーンショット 2025-06-29 200204.png

本来ならWordPressのログイン画面が出るはずなのに、再度認証を求められてしまう。

🧪 原因調査と対応

原因を調べたところ、どうやらログインページの読み込みに必要な JavaScript や CSS も Basic認証で保護されており、それが通らず再認証が発生していたようです。

スクリーンショット 2025-06-29 200841.png

対策として、以下の3つのディレクトリを Basic認証の対象外とするように設定しました。

・wp-admin
・wp-includes
・wp-content

各ディレクトリ配下に .htaccess ファイルを設置し、以下の内容を記載しています。

.htaccess

<FilesMatch ".*">
Satisfy Any
Order allow,deny
Allow from all
Deny from none
</FilesMatch>

この対応により、ログインページの表示は問題なく完了!

😇 しかし記事ページが…

次に記事ページにアクセスしてみると、Basic認証が出てこず、ページが表示されてしまいました。

スクリーンショット 2025-06-29 203714.png

…え? なんで? ここは認証されてないとダメなはず。

再度 .htaccess を見直してみたところ、原因はこの部分でした。

<FilesMatch "^(?!wp-login\.php)">
  Order allow,deny
  Allow from all
  AuthType Basic
  AuthName "auth"
  AuthUserFile C:/xampp/htdocs/wordpress/pass1/.htpasswd
  require valid-user
</FilesMatch>

<FilesMatch wp-login.php>
  Order allow,deny
  Allow from all
  AuthType Basic
  AuthName "auth"
  AuthUserFile C:/xampp/htdocs/wordpress/pass2/.htpasswd
  require valid-user ←ここ★
</FilesMatch>

require valid-user は、

「認証に成功した任意のユーザーであればアクセスを許可する」

という意味です。

つまり、ログインページで1回 Basic認証を突破すると、その認証情報が記事ページにも適用され、弾かれなくなっていたということでした。

🛠 最終的な解決策

最終的には、次のように .htpasswd を 1ファイルに統合し、ユーザーごとのアクセス制限をかけることで解決しました。

.htpasswd(統合)

admin1:pass1
admin2:pass2

.htaccess

<FilesMatch "^(?!wp-login\.php)">
  Order allow,deny
  Allow from all
  AuthType Basic
  AuthName "auth"
  AuthUserFile C:/xampp/htdocs/wordpress/.htpasswd←修正★
  require user admin2 ←修正★
</FilesMatch>

<FilesMatch wp-login.php>
  Order allow,deny
  Allow from all
  AuthType Basic
  AuthName "auth"
  AuthUserFile C:/xampp/htdocs/wordpress/.htpasswd←修正★
  require user admin1 ←修正★
</FilesMatch>

admin1 はログインページへのアクセスに対して Basic認証を設定。
admin2 は記事ページ全体へのアクセスに対して Basic認証を設定。

結果

ログインページでは admin1 の認証が必要。

スクリーンショット 2025-06-29 202713.png

スクリーンショット 2025-06-29 202849.png

記事ページでは admin2 の認証が必要。

スクリーンショット 2025-06-29 202746.png

スクリーンショット 2025-06-29 203714.png

👉 認証が共有されず、ログインページ・記事ページそれぞれで正しくBasic認証が表示されるようになり、無事ログインにも成功しました!🎉

📝 おわりに

PHP未経験で WordPress 案件に入り、思わぬところでハマりましたが、Basic認証の挙動や .htaccess の柔軟さを学ぶ良い経験になりました。

同じような構成を取る人は少ないかもしれませんが、どこかで誰かが悩んだときのヒントになればうれしいです。

💡補足:今回学んだポイントまとめ

・require valid-user:認証に成功した任意のユーザーに許可
・require user admin1:指定したユーザー(ここでは admin1)のみ許可
・.htpasswd に複数ユーザー可:ユーザー単位の制御が可能

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?