taupe WebとAIと暮らし

Notes / 実践記録

PHPと.htaccessでPDFの直接アクセスを制限した時の記録

PHPと.htaccessでPDFの直接アクセスを制限した時の記録

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

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

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

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

2026年7月追記。
この記事は、2015年にPHPと.htaccessでPDFへの直接アクセスを制限し、特定ページ経由でのみ表示する実装を試した記録です。
ただし、この方法を「機密PDFを安全に守れる仕組み」として読むのは危険です。
本当に保護が必要なPDFは、公開ディレクトリにそのまま置かず、認証、権限確認、ログ、期限付きURL、保存場所の設計まで含めて考える必要があります。
現在確認するなら、Apache公式のAccess Control、PHP公式のSessionsreadfile()header()を見てから判断するのが安全です。
PHP環境の古い記録は、MAMPのphpMyAdminでインポート上限を上げた時の記録にも残しています。

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

閲覧制限といっても、閲覧するためにIDやパスワード求めるわけではなく、特定ページ経由のときにのみPDFが表示されるようにする仕様です。
通常ウェブサイトにPDFを置いて閲覧させる場合は、下図のようにHTMLにPDFへのリンクを設置して、ユーザーがクリックするとPDFが表示されるようにしますよね。
特定ページからPDFを表示する導線のイメージ
ただ、このままでは誰でも閲覧できる状態です。
ここに制限を設けます。
仕様としては、

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

となります。

実装方法

使用するファイルは下記の4つです。
PDF閲覧制限に使う4つのファイル構成

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

※今回は同階層にすべて置いてあります。
これらのファイルを用い、下図のような仕組みを実装します。
PHPとhtaccessでPDF表示を制御する流れ
今回使ったコードをまとめていきます。

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

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

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

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

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

●●●の部分をtxtなど別の拡張子にします。
ブラウザに直接PDFへのURLを入力して確認します。
表示できていたPDFが”Forbidden”となっていれば正しく動作しています。
PDFへ直接アクセスした時に制限を確認する画面

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

楽天Kobo電子書籍ストア
¥2,728 (2026/07/19 11:21時点 | 楽天市場調べ)

続けて読む

次に読むなら、これ。

同じテーマの実践記録や、taupeの読み方へ進めます。

同じテーマ技術メモ近い実践記録をカテゴリから続けて読めます。サイトの読み方FAQ運用方針や、よくある質問を確認できます。taupeについてこのサイトについてどんな視点で作り、使い、運用しているかをまとめています。

Category

Author / Official hub

イシカワヒデカズの実践記録

Web制作、開発、AI活用、メディア運営の相談先は公式サイトにまとめています。