ディレクトリ単位でなく、もっと細かく制御してDigest認証をかける必要が出てきたので、PHP側で制御しようと思ったのですが、ちょっと引っかかってしまいました。
CodeIgniter用ライブラリ
システムのベースがCodeIgniterだったので、適したライブラリ(あずみさん作)を入れて、Digest認証を行うこととしました。
…ところが、正しいパスワードを何度入れても認証画面が消えず、認証を通すことができませんでした。
立ちはだかる壁
Apacheと一体化するmod_php
と違って、PHP-FPMは別プロセスで動いているので、相互のデータのやり取りでうまくいかないことがあります(環境変数の設定に悪戦苦闘した例)。今回もそれと同様に、ApacheがAuthorization:
ヘッダをクリアしていました。
設定変更…しようとしたけれど
調べてみると、CGIPassAuthというディレクティブがあって、これを付ければヘッダを通してくれるし、しかも.htaccess
で設定できることがわかりました。で、実際に設定したところ、無情にも「Internal Server Error」の画面を拝むこととなってしまいました。
Apacheのドキュメントを確認してみると、CGIPassAuth
が使えるのはApache 2.4.13以降ですが、手元のApacheは2.4.6ということで、リビジョン差で動かない、という結論でした。
別なルートで設定する
どうしたものかと調べていくと、StackOverflowの投稿にたどり着きました。CGIPassAuth
が使えない場合に、SetEnvIf
でセットする、という技が紹介されていました。
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
もちろん、これでは通常のPHP_AUTH_XXX
系で取れなくなるので、$_SERVER['REDIRECT_HTTP_AUTHORIZATION']
と、PHP側でアクセスする変数も別なのにする必要がありました。