この記事について
| 環境 | Apache(httpd)+ Laravel、サーバー移行中のステージング環境 |
|---|---|
| 目的 | 移行先サイト全体にBasic認証をかけて外部から見えないようにする |
| 結果 | <Directory> ではなく <Location> で認証をかけたら解決 |
つまずきポイント要約
<Directory>は「実フォルダ」に効く設定で、「URL」に効くわけではない- Laravelのリライトが絡むと、
<Directory>にマッチせず認証が発動しないことがある - URL単位で確実にかけるなら
<Location>を使う - 確認は
curl -Iで。401が返ればOK、200のままなら効いていない
事象
Basic認証を入れたのに、ブラウザで パスワード入力ダイアログが出ない。curl -I でも 200 OK のまま。
curl -I https://new.example.com/
# HTTP/1.1 200 OK
原因
<Directory> で認証をかけていたが、<Directory> は URLではなく実フォルダに対して効く設定。
Laravel+リライトなどの影響で、Apacheがそのリクエストを そのDirectoryにマッチさせられず、認証が発動しなかった。
<Directory /var/www/html/example-new/public>
AuthType Basic ...
</Directory>
対処
<Directory> をやめて、URLに対して確実に効く <Location> で認証をかけたら直った。
<Location "/">
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /etc/httpd/.htpasswd-new
Require valid-user
</Location>
反映:
sudo httpd -t && sudo systemctl restart httpd
成功判定(401になればOK):
curl -I https://new.example.com/ | egrep -i 'HTTP/|WWW-Authenticate'
# HTTP/1.1 401 Unauthorized
補足
<Location "/"> は / 配下すべてに認証がかかる(サイト全体保護)。
移行中のステージング用途なら安全。
