При проектировании одного проекта столкнулся с проблемой некоторых браузеров открывать PDF-документ непосредственно в окне браузера. Это чревато тем, что вы вообще ничего никогда не сможете просмотреть, либо при сохранении открытого файла получите «битый» документ.
Было принято решение отдавать файлы скриптом. Чтобы не мудрить с движком — подпилил все напильником через mod_rewrite.
В .htaccess пишем:
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule .pdf$ /load.php [L,QSA] </IfModule>
Ссмысл правила в том, что все запросы, которые оканчиваются на .pdf, заворачиваются на файл load.php в корне сайта.
В самом этом файле пишем нечто подобное (проверки опущены):
$root = dirname(__FILE__); $request = $_SERVER['REQUEST_URI']; $filename = basename($request); $path = $root.'/'.$request; if (file_exists($path)) { if (ob_get_level()) { ob_end_clean(); } header("Content-Type: application/pdf; charset=UTF-8"); header("Content-Length: ".filesize($path)); header("Content-Disposition: attachment; filename="{$filename}""); header("Content-Transfer-Encoding: binary"); header("Cache-Control: must-revalidate"); header("Pragma: no-cache"); header("Expires: 0"); readfile($path); } ?>
Способ второй
Основан на использовании модуля mod_headers и директивы FilesMatch:
# Проверим наличие модуля <IfModule mod_headers.c> # Выберем запросы на PDF без учета регистра имени файлов <FilesMatch ".(?i:pdf)$"> # Отправим соответствующие заголовки ForceType application/octet-stream Header set Content-Disposition attachment </FilesMatch> </IfModule>
Если возникнут вопросы — пишите в комментах.
Ссылки
Источник: https://www.kobzarev.com/programming/give-the-pdf-file-of-the-jump/