プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、BASIC認証のかかったフォルダ配下のファイルを、BASIC認証を経由していない人に閲覧させる
結論から書くと、BASIC認証のかかっていないフォルダに中継用のファイル(プログラム)をおいて、
そいつにBASIC認証のかかったフォルダ配下のファイルを読み込んで表示させればOKです。

例えば

/dir1/hoge.pdf

ファイルがあったとして「dir1」フォルダにBASIC認証がかかっていたとしましょう。
「hoge.pdf」を一般公開したいです。

そんなときは、例えば

■relay.php
//対象ファイル
$targetDir = dirname(__FILE__) ."/dir1/";
$targetFile = "hoge.pdf";

//ヘッダ出力
header('Content-Type: application/pdf');
header("Content-Disposition: attachment; filename=" . $targetFile);

//対象ファイル読み込み&出力
readfile($targetDir . $targetFile);

をルート直下に置いて「relay.php」にアクセスすれば、
BASIC認証無しで「hoge.pdf」を閲覧できます。

それでは詳細を書いていきます。

PHP、ファイルの直リンクやURL直接入力での参照を禁止する(リファラを見ないやり方)

の記事で、ファイルの直リンクを禁止するやり方を書いたのですが、
実は困ったことになってしまいましてね。

元々ファイルの直リン禁止自体は「.htaccess」ファイルを使って

<Files ~ "\.(pdf|csv)$">
deny from all
</Files>

のようにして禁止していました。
拡張子「.pdf」「.csv」へのアクセスを拒否な設定ですね。

ところがどっこい、某レンタルサーバでは自前の「.htaccess」ファイルを置けませんでした。

おーまいがっ!<( ̄◇ ̄;)>

とはいえ、諦めるわけにはいきません。

う~ん、何とかならんべか(-公-;

と悩み、駄目元で直リンク禁止対象ファイルが入っているフォルダにBASIC認証をかけたら
普通に上手く行きました\(--)/よっしゃ!

考えてみたら当たり前ですね。

BASIC認証はHTTPで定義されている認証です。
つまりHTTPアクセス以外は関係ありません。
プログラムからファイルアクセスする分には普通に読み込めるので、
後は煮るも焼くもご自由にどうぞです。

私の場合は、最終的にこんな手順を踏みましたφ(--)

1.「pdf_dir/」フォルダにBASIC認証をかける

2.以下の内容の「disp_pdf.php」をルート直下に配置
//対象ファイル
$targetDir = dirname(__FILE__) ."/pdf_dir/";
$targetFile = $_POST{'file_name'};

//ヘッダ出力
header('Content-Type: application/pdf');
header("Content-Disposition: attachment; filename=" . $targetFile);

//対象ファイル読み込み&出力
readfile($targetDir . $targetFile);
※実際にはエラー処理とかを入れています

3.PDFの閲覧はすべて「disp_pdf.php」経由で行う

完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事