Перенаправьте файлы в простую форму перед загрузкой
Вопрос
Привет, я пытаюсь перенаправить все ссылки на любой PDF-файл на моем сайте на страницу с формой, которая собирает информацию о пользователе, прежде чем он сможет приступить к загрузке / просмотру pdf.
Например
Я хочу перенаправить файлы * .pdf на веб-сайте на запрос.php?file=name_of_pdf_being_redirected
Где request.php находится страница с формой, на которой запрашиваются некоторые детали, прежде чем продолжить.
Все PDF-файлы на сайте хранятся в папке /pdf.
Есть какие-нибудь идеи?
Редактировать:извините, я использую Apache на сервере.
ХОРОШО, Я ДОБИРАЮСЬ ТУДА:Сейчас он у меня работает, используя:
RewriteEngine на RewriteRule ^pdf/(.+.pdf)$ request.php?file=/$1 [R]
Но теперь, когда он переходит на страницу загрузки, когда я хочу позволить пользователю фактически загрузить файл, мое новое правило - возвращать ссылку для скачивания обратно в форму:-P хаха, так есть ли возможность разрешить ему загружать файл после отправки формы, и вы находитесь в download.php ?
Решение
Вы можете попробовать это:
- Переместите ваши файлы в папку "вне" корневого каталога вашего веб-сайта, чтобы никто не мог получить к ней доступ через браузер
- Используйте сеансы, чтобы определить, заполнил ли человек форму или нет
- Используйте скрипт загрузки файлов на базе php.В своей самой наивной форме это могло бы выглядеть примерно так:
if ( isset( $_SESSION[ 'OK_TO_DOWNLOAD' ] ) == false ) { header( "Location: must_fill_this_first.php" ); exit( 0 ); } header( "Content-type: application/pdf" ); // double check the above, google it as i am not sure echo file_get_contents( 'some_directory_inaccessible_thru_www/' . $_GET[ 'pdf_name' ] ); // ideally a binary-safe function needs to be used above
Это испытанный метод, который я использовал на веб-сайте.Пример кода является черновым наброском и нуждается в доработке.
Другие советы
Идеи?Вы могли бы начать с сообщения нам, какой веб-сервер / сервер приложений вы используете, это могло бы помочь :-)
В Apache вы должны иметь возможность использовать RewriteRule для преобразования запроса в другую форму.Например, поворачивая /pub/docs/x.pdf
в request.php?file=/pub/docs/x.pdf
это можно было бы сделать с помощью чего-то вроде:
RewriteRule ^/pdf/(.*)\.pdf/ request.php?file=/$1.pdf
Имейте в виду, что это по памяти (прошло шесть лет с тех пор, как я коснулся Apache и все еще чистый :-), формат может немного отличаться.
Обновить:
Теперь, когда вы с этим разобрались, вот пара вариантов решения вашей следующей проблемы.
1 / Переименуйте PDF-файлы с другим расширением, чтобы они не попадали под действие правила перезаписи.Они должны быть настроены так, чтобы передавать клиенту один и тот же тип MIME, чтобы они открывались в выбранном клиентом средстве просмотра.
2 / Также выполняйте загрузку как часть скрипта, а не как прямой доступ к PDF-файлу.Поскольку отправка формы является HTTP-запросом, вы должны иметь возможность немедленно ответить на него содержимым PDF, а не перенаправлять их повторно снова перейдите на страницу загрузки.
Этот второй вариант был бы моим выбором, поскольку он:
- останавливает людей, выясняющих, что они могут получить доступ к PDF-файлам, просто запросив xx.pdfx вместо xx.pdf.
- позволяет пользователю быстрее получить PDF-файл (ему не нужно снова переходить по ссылке).
Обратите внимание, мой ответ касается веб-сайта .NET, но я уверен, что такие же конструкции существуют где-то в PHP.
У меня был бы HttpModule с путем * .pdf, который просто выполняет ответ.Перенаправление на request.php?...и т.д. (в моем случае request.aspx) А затем в обработчике событий для нажатия кнопки на этой странице, когда вы знаете, какой PDF-файл отображать и что он авторизован, просто выполните ответ.ContentType = [MIME-тип pdf], а затем Response.Файл записи (pdfFile) и, наконец, Response.End().
Есть другие вещи, которые вы можете добавить, чтобы сделать его лучше, такие как размер файла и т.д.Но в минимальном случае это сработало бы.Если вам нужен код для этого на C #, я мог бы придумать что-нибудь примерно за 3 минуты, но в PHP я совершенно запутался.Я бы начал с поиска HttpModules и с того, как написать их на PHP.
Поиск в Google "PHP HttpModule" приводит к следующему: Эквивалент ASP.NET HttpModules в PHP так что, возможно, я немного ошибаюсь, но, надеюсь, это отправная точка.
Используйте файл .htaccess, если вы используете веб-сервер Apache.Вам нужно будет убедиться, что у вас включен mod_rewrite, но как только вы это сделаете, вы сможете переписать все файлы, используя эти две простые строки:
RewriteEngine На RewriteRule ^.pdf$ /rewrite.php [NC,L]
Если вы используете IIS, вы можете выполнить нечто подобное с помощью ISAPI_Rewrite .
Другой альтернативой является размещение ваших PDF-файлов внутри каталога, который не является общедоступным, и тогда любой запрос, сделанный для ресурса pdf, вернет ошибку "отказано в доступе", и доступ к файлам возможен только через соответствующий скрипт загрузки.
if($user==authenticated){
//set pdf headers
echo file_get_contents('actual.pdf');
no mod перезаписывает, скрывает фактический исходный код и является тем, что я обычно делаю - надеюсь, это поможет