PDF等閲覧制限 特定ページ経由からのみ閲覧可能に【PHP・htaccess】

ウェブ制作

本ページはアフィリエイトプログラムを利用しています

PDFをウェブサイトに置いてユーザーに閲覧させたいけど、特定のページを経由しないと見れないようにしたい」
こんな依頼を受けることが結構あります。
この要望が必要な場面は、

  • 利用規約ページは必ず見て欲しい
  • ユーザーに何らかアクションをしてもらった特典としてPDFを閲覧してもらいたい

などが挙げられますね。
毎回どうやって作ったか思い出しながらやっているので、今日は備忘録として上記要望の実装方法をまとめます。

PHPと.htaccessを利用してPDFの閲覧を制限する

閲覧制限といっても、閲覧するためにIDやパスワード求めるわけではなく、特定ページ経由のときにのみPDFが表示されるようにする仕様です。
通常ウェブサイトにPDFを置いて閲覧させる場合は、下図のようにHTMLにPDFへのリンクを設置して、ユーザーがクリックするとPDFが表示されるようにしますよね。
00%e3%83%a6%e3%83%bc%e3%82%b5%e3%82%99%e3%83%bc%e3%81%8b%e3%82%99%e3%82%af%e3%83%aa%e3%83%83%e3%82%af%e3%81%99%e3%82%8b%e3%81%a8pdf%e3%81%8b%e3%82%99%e8%a1%a8%e7%a4%ba%e3%81%95%e3%82%8c%e3%82%8b
ただ、このままでは誰でも閲覧できる状態です。
ここに制限を設けます。
仕様としては、

  • PDFはURL直接入力や直リンクで閲覧できないように.htaccessを利用して閲覧を制限する
  • 特定のページからのアクセスの場合のみ、PDFを表示する

となります。

実装方法

使用するファイルは下記の4つです。
01%e4%bd%bf%e7%94%a8%e3%81%99%e3%82%8b%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%af%e4%b8%8b%e8%a8%98%e3%81%ae4%e3%81%a4%e3%81%a6%e3%82%99%e3%81%99

  • .htaccess – PDFへの直接アクセスを制御
  • checkPermission.php – 特定ページからのアクセスかを判断。OKの場合PDFを出力。
  • index.php – PDFへのリンクを貼る画面
  • test.pdf – 表示するPDF

※今回は同階層にすべて置いてあります。
これらのファイルを用い、下図のような仕組みを実装します。
02%e3%81%93%e3%82%8c%e3%82%89%e3%81%ae%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e7%94%a8%e3%81%84%e3%80%81%e4%b8%8b%e5%9b%b3%e3%81%ae%e3%82%88%e3%81%86%e3%81%aa%e4%bb%95%e7%b5%84%e3%81%bf%e3%82%92
今回使ったコードをまとめていきます。

.htaccess – PDFへの直接アクセスを制御

まずは.htaccessを利用してPDFへのアクセスを拒否します。

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

今回はPDFの制御をしましたが、別のファイルを制御することも可能です。

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

●●●の部分をtxtなど別の拡張子にします。
ブラウザに直接PDFへのURLを入力して確認します。
表示できていたPDFが”Forbidden”となっていれば正しく動作しています。
03%e3%83%95%e3%82%99%e3%83%a9%e3%82%a6%e3%82%b5%e3%82%99%e3%81%ab%e7%9b%b4%e6%8e%a5pdf%e3%81%b8%e3%81%aeurl%e3%82%92%e3%81%86%e3%81%a3%e3%81%a6%e7%a2%ba%e8%aa%8d%e3%81%97%e3%81%be%e3%81%99

index.php – PDFへのリンクを貼る画面

次にPDFへのリンクを設置するページの作成をします。
ここではPHPでセッションを開始し、$_SESSION[‘permission’]に’true’という文字列を持たせます。

<?php
session_start();
$_SESSION['permission']= 'true';
?>
<p><a href="checkPermission.php" target="_blank">こちら</a>からPDFをダウンロードできます</p>

この’true’が設定されているかどうかがこの後の判断材料となります。
リンク先は特定ページからのアクセスかを判断するPHPにしておきましょう。

checkPermission.php – 特定ページからのアクセスかを判断。OKの場合PDFを出力。

index.php内のリンク先がこのPHPファイルになります。
$_SESSION[‘permission’]に’true’が入っているかを確認し、入っている場合はPDFを出力します。
ここではPDFは同階層にあるtest.pdfを想定しています。

<?php
session_start();
if (isset($_SESSION['permission']) && $_SESSION[‘permission’] == 'true'){
header("Content-Type: application/pdf");
readfile(dirname(__FILE__) . "/test.pdf");
}
else{
//不正アクセスの場合の対処を記述
}
?>

$_SESSION[‘permission’]に’true’が入っていない場合はelse内の対処になります。
“//不正アクセスの場合の対処を記述”の部分にはお好きな処置を書いてください。
もし、PDFを出力するのではなく、ダウンロードさせたい場合は、

header("Content-Type: application/pdf");

header("Content-Disposition: attachment; filename=test.pdf");

に差し替えてください。
ただ、この対応の場合はPC以外のスマートフォンなどではエラーになってしまいますのでお気をつけください。

まとめ

以上で、「PDFをウェブサイトに置いてユーザーに閲覧させたいけど、特定のページを経由しないと見れないようにしたい」という要望のプログラムの実装が完了です。
同じような案件でお役に立てば幸いです。

 

オススメ
アイテム

コメント

タイトルとURLをコピーしました