🔰 はじめに
はじめまして。
中途・未経験からエンジニアになり、現在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認証が表示されました。
ユーザー名とパスワードを入力してログインを試みます。
認証後、もう一度Basic認証が表示されてしまいました。↓
本来ならWordPressのログイン画面が出るはずなのに、再度認証を求められてしまう。
🧪 原因調査と対応
原因を調べたところ、どうやらログインページの読み込みに必要な JavaScript や CSS も Basic認証で保護されており、それが通らず再認証が発生していたようです。
対策として、以下の3つのディレクトリを Basic認証の対象外とするように設定しました。
・wp-admin
・wp-includes
・wp-content
各ディレクトリ配下に .htaccess ファイルを設置し、以下の内容を記載しています。
.htaccess
<FilesMatch ".*">
Satisfy Any
Order allow,deny
Allow from all
Deny from none
</FilesMatch>
この対応により、ログインページの表示は問題なく完了!
😇 しかし記事ページが…
次に記事ページにアクセスしてみると、Basic認証が出てこず、ページが表示されてしまいました。
…え? なんで? ここは認証されてないとダメなはず。
再度 .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 の認証が必要。
記事ページでは admin2 の認証が必要。
👉 認証が共有されず、ログインページ・記事ページそれぞれで正しくBasic認証が表示されるようになり、無事ログインにも成功しました!🎉
📝 おわりに
PHP未経験で WordPress 案件に入り、思わぬところでハマりましたが、Basic認証の挙動や .htaccess の柔軟さを学ぶ良い経験になりました。
同じような構成を取る人は少ないかもしれませんが、どこかで誰かが悩んだときのヒントになればうれしいです。
💡補足:今回学んだポイントまとめ
・require valid-user:認証に成功した任意のユーザーに許可
・require user admin1:指定したユーザー(ここでは admin1)のみ許可
・.htpasswd に複数ユーザー可:ユーザー単位の制御が可能