BASIC認証を掛けたディレクトリ内ファイルがSSIで読込できない場合の対処法
BASIC認証を掛けたディレクトリ内にあるファイルは外からSSIで読み込む事ができずにエラーとなります。
この場合、SSI対象の読込ファイルをBASIC認証ディレクトリの外に出せばエラーは出ません。
認証エリアから外のファイル、或いは同じエリア内のファイルを読み込む事はできます。
BASIC認証を掛けたディレクトリ内ファイルがSSIで読込できない
本記事では、IDとPASSを使って閲覧制限されたディレクトリ内のファイルが、SSIで読み込みできない場合の対処法をご紹介します。
SSI(Server Side Including)とは
SSIは(Server Side Including)の略で、よく使われる機能ですね。
WEBページのヘッダーやフッターなど、共通部分として作られたファイルを表示できる便利な機能です。
SSI実行コード(.htaccess)
Options +Includes AddType text/html .shtml AddHandler server-parsed .html
SSIエラーが起きて読み込めない
上手くいかないとSSIを設定している部分に以下のエラーが出ます。
「an error occurred while processing this directive」
上記は、SSIの処理ができなかった場合に読込箇所に表示されるものです。
SSIエラーの原因候補
この時処理ができなかった原因には様々な要因が考えられます。
SSIエラーの原因の例
・ファイル指定先にミスがあった
・fileとvirtualの使い方が違う
・サーバールートパスを記述している
・絶対パスを指定している
まずは上記を確認してみるべきです。これで正常に表示される可能性もありますからね。
BASIC認証が影響している場合
上記に加え、BASIC認証を掛けているディレクトリ内に読込ファイルがある場合、このエラーが出る事があります。
上の候補のいずれを試してもエラーが解消されない場合は、このBASIC認証の影響を疑ってみましょう。
BASIC認証コードファイル例
BASIC認証は一般的に、.htaccessファイルと.htpasswdファイルで構成します。
BASIC認証画面
ページを開くと上記の様なパネルが表示され、IDとパスワードを入力しないと閲覧できない仕組みですね。
.htaccessファイル
BASIC認証のため、.htaccessに記述されるコード例です。
AuthUserFile /home/users/llpeg/web/contents/type/c3/mseks/.htpasswd AuthGroupFile /dev/null AuthName "Input ID and Password." AuthType Basic require valid-user <Files ~ "^.(htpasswd|htaccess)$"> deny from all </Files>
.htpasswdファイル
このファイルにIDとPASSを記述します(内容は書きません)。
この時パスワードは「ハッシュ化」という暗号化したものを記載します。
解決方法
結論として、SSIの読込対象となる共通ファイルが「BASIC認証を掛けたディレクトリ内にある」場合、そのファイルはSSIで読込ができません。
図解
.htaccessと.htpasswdを設置している場所と同じ位置に、SSI用のファイルも存在している場合ですね。
ですので、このSSI用の読込ファイルをBASIC認証ディレクトリの外に出してやれば正常に動く訳です。
BASIC認証を掛けているページ構成
図解でさらっと説明しましたが、もう少し詳しくご紹介しましょう。
https://lpeg.info/contents/を、BASIC認証を掛けたディレクトリとします。
・https://lpeg.info/contents/.htaccess
・https://lpeg.info/contents/.htpasswd
・https://lpeg.info/contents/menu.txt
この様にメニュー用のファイルもcontents内に入っている状態です。
各ページのSSI読込コード(contentsディレクトリの外にあるWEBページ)
<!--include virtual="contents/menu.txt" -->
上記の様にBASIC認証が掛かるディレクトリ内のファイルを読み込もうとすると、SSIエラーが出ます。
ですので以下のようにしましょう。
読込ファイルのみを外に出す(一つ上のディレクトリに移動)
・https://lpeg.info/contents/.htaccess
・https://lpeg.info/contents/.htpasswd
・https://lpeg.info/menu.txt
各ページのSSI読込コード(変更後)
<!--include file="menu.txt" --> or
<!--include virtual="../menu.txt" -->など
とにかくこのmenu.txtが、BASIC認証の掛かったcontentsディレクトリの外にあれば読込ができるようになります。
なぜBASIC認証ページでは効かないのか
IDをPASSを設定したページは、その権限がディレクトリ内の全てのファイルに対して適用されます。
同じディレクトリ内に.htmlや.phpなどがあれば、全て認証の対象に入る事になります。
ですのでSSIで外から読み込みする場合、認証を通していないので制限(ブロック)が掛かってしまう訳ですね。
認証エリアから外のファイルは読み込める
今回はあくまで外からBASIC認証が掛かっているディレクトリの中のファイルが読み込めないというお話です。
その逆で、BASIC認証を掛けたディレクトリから外のファイルを読み込むのは問題ありません。
ただ最初にページを開く際にログインをしなければならないだけで、ログインすれば外のファイルも読み込めます。
今回遭遇した実際の例
弊職の場合は、クライアントWEBサイトでこの事に遭遇しました。
特定のディレクトリ内に以下のファイルをそれぞれ設置し、ディレクトリへBASIC認証を掛けていました。
・.htaccess
・.htpasswd
・htmlフォーム
・phpファイル
・書き込み用txtファイル(SSI読込対象ファイル)
入力した文字情報を、phpのファイル書き込み関数を使って.txtファイルに記述します。
全ページのフッター部分にSSIでその.txtファイルをインクルードして表示させる事が目的でした。
phpコード(修正前)
https://lpeg.info/kakikomi/ディレクトリ内のphpファイル例です。
<?php if($contents == $contents2 && $contents != ''){ print $contents; } $text = 'contents_display.txt'; //書き込み用txtファイル $text_addition = $text; file_put_contents("$text_addition", "$contents"); ?>
この仕組み自体を一つのディレクトリ内で管理するため、書き込みされたファイル(ここではcontents_display.txt)も同じディレクトリ内に設置していました。
そのため、このcontents_display.txtが他の全ページからSSIで読み込みできませんでした。
「an error occurred while processing this directive」のエラーが出る訳です。
そこで上記の様に、contents_display.txtをkakikomi/ディレクトリの外に出しておきます。
phpコード(修正後)
<?php if($contents == $contents2 && $contents != ''){ print $contents; } $text = '../contents_display.txt'; //一つ上のディレクトリにある $text_addition = $text; file_put_contents("$text_addition", "$contents"); ?>
書き込みファイルの位置
https://lpeg.info/contents_display.txt
記述する書き込みファイルがkakikomi/ディレクトリの外にあっても、きちんと書き込みができます。
構成ファイルがkakikomi/ディレクトリ内に全て収まっていない点は、気持ち悪いですけどね。
ですがこの様にする事でエラーを回避できる訳です。
SSIエラーを回避する3つのルール
SSIのエラーを回避する基本ルールは以下となります。
外から中がダメで、中から外、中から中はOK
・1.エリア外から認証エリア内の読込は不可
・2.認証エリア内からエリア外の読込はOK
・3.認証エリア内で同エリア内の読込もOK
つまり外から認証エリア内のみが読み込みできない事になりますね。
SSIだけでなくiframeなどでも制限される
今回はSSIによるインクルードを例に取ってご紹介しましたが、iframeなど枠内に別のファイルを表示する場合も同様です。
BASIC認証を掛けたディレクトリ内のページをiframeで読みだそうとする事はできません。
枠内ファイルは認証ディレクトリの外に置いておく必要があります。
TOPディレクトリにBASIC認証を掛けている場合
上記は、WEBサイトのサブディレクトリにBASIC認証を掛けている場合の対処法となります。
もしあなたのWEBサイトがTOPディレクトリから全体にBASIC認証を掛けている場合は、そもそもこの問題に遭遇しません。
先ほど紹介した基本ルール3番目「エリア内から同エリア内」に相当します。
htaccessは設置ディレクトリ全域に効果発生
.htaccessは設置したディレクトリ配下全域に効果を及ぼします。
もしTOPページに設定したのであれば、WEBサイト全域に効果が及ぶことになりますね。
最初にIDとPASSでログインすれば許可がされますので、どのページでもSSIは機能するはずです。
まとめ(基本ルールのおさらい)
ポイントは、読込するファイルをBASIC認証ディレクトリ内に置かない事ですね。
それを踏まえて基本ルールをおさらいしておきます。
・外からBASIC認証を掛けたページ内にあるファイルを読み込む事はできない
・BASIC認証を掛けたページ内から外にあるファイルを読み込む事はできる
・BASI認証を掛けたページ内で同じ中のファイルを読み込む事もできる
他の記事で
他のサイトで、後からBASIC認証を掛けたページ内でSSIが効かなくなったという記事を見ました。
読込元の共通ファイルが前々からBASIC認証を掛けたページの外にあるのであれば、効かない事は無いはずです。
おそらく何かしら記述部分が間違っているのではないかと思われます。
まずはディレクトリ内に入れて検証する
どうしても上手くいかない場合は、一旦読込予定の共通ファイルをコピーして、BASIC認証を掛けたディレクトリ内に入れてみて下さい。
同じディレクトリ内に入れて、記述をinclude file=""とすれば、読込されるはずです。
そこから次はvirtualで外にあるファイルを指定して進めてみましょう。