Перенаправьте файлы в простую форму перед загрузкой

StackOverflow https://stackoverflow.com/questions/766739

Вопрос

Привет, я пытаюсь перенаправить все ссылки на любой 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 перезаписывает, скрывает фактический исходный код и является тем, что я обычно делаю - надеюсь, это поможет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top