Perl Perl_4 memo other
[memo] .htaccess の RewriteRule で Basic 認証が効かない問題 (0x21e)
目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x21e 回。
先日ハマった、上位階層の「 .htaccess 」で「 RewriteRule 」を設定している場合に、下位階層の「 .htaccess 」で設定した「 AuthType Basic 」( ベーシック認証 ) が効かない問題の解決策をメモする。
構成
ファイル「 .htaccess 」を設置した Web サーバのディレクトリ構成は次のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | Web Document Root +--------+ | htdocs | [ .htaccess ] +----+---+ <ifmodule mod_rewrite.c=""> | RewriteEngine On | RewriteBase / | RewriteRule ^index\.php$ - [L] | RewriteCond %{REQUEST_FILENAME} !-f | RewriteCond %{REQUEST_FILENAME} !-d | RewriteRule . /index.php [L] | </ifmodule> | +-------------+--------+--------+----- ... . | | | | +----+-----+ +---+--+ +---+--+ +---+--+ | this dir | | dir1 | | dir2 | | dir3 | ... . +----------+ +------+ +------+ +------+ [ .htaccess ] AuthType Basic AuthName "Basic Authorization" AuthUserFile /home/your/dir/.htpasswd require valid-user order deny,allow |
ドキュメントルートの「 htdocs 」直下には「 WordPress 」のための「 .htaccess 」が予め設置されています。
今回 Basic 認証を掛けるのはディレクトリ「 this dir 」だけなので、僕はその中に 認証のための「 .htaceess 」を設置しました。
しかし、Web ブラウザから該当のディレクトリ「 this dir 」にアクセスすると、上位階層の「 RewriteRule 」が発動して、認証のためのダイアログボックスが表示されません。
認証のためのダイアログボックスが表示されないので、Basic 認証の利用ができない状態です。
RewriteRule の除外設定が効かない
「 RewriteRule 」からの除外設定を忘れていたことに気が付いた ( というよりも、最初は上位階層の .htaccess の存在を知らなかった ) ので、「 RewriteCond 」による設定や「 RewriteEngine off 」等、いくつか除外のための記述を試しました。
しかし、認証のダイアログは表示されません。
「 Directory 」ディレクティブや「 Location 」ディレクティブも試しましたが、該当する Web サーバでは .htaccess によるオーバーライドが許可されていない様子です。
上位階層の .htaccess をリネームして無効化すれば Basic 認証は動作するので、「 ReriteRule 」との兼ね合いが原因であることは確かです。
しかし、その解決方法が分かりませんでした。
解決方法
問題の解決方法は ルートディレクトリに mod_rewrite、サブディレクトリに基本認証 で、認証要求ださずに404になるなど - ここはちょっと見せられない で見つけることが出来ました。
僕の環境では、結果として以下の記述をディレクトリ「 this dir 」の .htaccess に記述することで Basic 認証のダイアログが表示される様になりました。
1 2 3 4 5 6 7 8 9 10 | ErrorDocument 401 "Unauthorized Access" RewriteEngine off AuthType Basic AuthName "Basic Authorization" AuthUserFile /home/your/dir/ .htpasswd require valid-user order deny,allow |
ポイントは 1 行目のディレクティブ「 ErrorDocument 」です。
動作の概要は、解決策のソースページ "Disable mod_rewrite for subdirectory - serverfault" のソースページ "Conflict Between Apache URL Rewriting and Basic Authentication - The Myriad Blog" にありました。
以下に Translation for oneself only of The Myriad Blog ( 自分のための翻訳 ) をメモします。
Apache URL Rewriting と Basic 認証の間の衝突
--- Posted by Peter Schultheiss on May 7th, 2009 at 04:04 pm ---
Apache のモジュール「 mod_rewrite 」はルールベースの書き換えエンジンを提供します。
それはほとんどの MVC フレームワーク (i.e. CakePHP や Zend Framework ) やコンテンツ管理ソリューション ( i.e. Drupal や WordPredd ) で利用されています。
書き換えエンジン ( mod_rewrite ) を利用する利点は次のとおりです:
・ Web サイトの URL はよりユーザの記憶に残ります
・ Web サイトの URL はよりサーチエンジンに適切になります
・ ファイルの拡張子を非表示にすることでサイト内部の動作をマスキングします
私は先日ベーシック .htaccess 認証で保護した場所でレガシーなアプリケーションの実行を必要としたときに問題に遭遇しました。
レガシーなアプリケーションはサブディレクトリに位置しています。
一般的に, あなたは .htaccess に次のコードの行を追加してリライトエンジンにディレクトリを無視する様に指示します.
1 2 3 | RewriteEngine off |
残念ながらこれは動作しません, 予想の通り.
ベーシック認証では, サーバは "401 Unauthorized ( 無許可 )" ヘッダを書いて, その後事前に定義されたパスに基づいてエラードキュメントを探します.
ほとんどの場合, あなたが保護したいディレクトリ内にエラードキュメントは存在しないので, その要求は投げられた 404 エラーでリライトエンジンによって処理されます.
この問題の解決方法はとても簡単です.
あなたは .htaccess ファイルにコードを 1 行追加して, Apache にエラードキュメントを無視するように指示します.
完了したら, コードはこのようになります:
1 2 3 4 5 6 7 8 9 10 | ErrorDocument 401 "Unauthorized Access" RewriteEngine off AuthType Basic AuthName "Administration" require valid-user AuthUserFile "/home/user/.htpasswds/public_html/admin/passwd" |
うまくいけば, だれかのイライラを少し解消できると思います。
0x21e -> 0x21f へ
次回は、Perl のビット演算子に戻って「 ビットストリング 」を確認します。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl CPAN Testers, Smoke Tools (d125)
Perl CPAN Testers, FollowUp (d124)
Perl CPAN Testers, Smoke Testing (d122)
Perl CPAN Testers, TestDuringInstall (d121)
Perl CPAN Testers, How do I become a tester? (d120)
Perl CPAN Testers, Reports and Grades (d119)
Perl CPAN Testers, FollowUp (d124)
Perl CPAN Testers, Smoke Testing (d122)
Perl CPAN Testers, TestDuringInstall (d121)
Perl CPAN Testers, How do I become a tester? (d120)
Perl CPAN Testers, Reports and Grades (d119)
上の画像に書かれている文字を入力して下さい
|
|
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。