문제

안녕하세요. 내 사이트의 PDF 파일에 대한 모든 링크를 사용자가 PDF를 다운로드/보기 전에 사용자 정보를 수집하는 양식이 있는 페이지로 리디렉션하려고 합니다.

예:

웹사이트의 *.pdf 파일을 request.php?file=name_of_pdf_being_redirected로 리디렉션하고 싶습니다.

request.php는 진행하기 전에 몇 가지 세부 정보를 요청하는 양식이 있는 페이지입니다.

사이트의 모든 PDF는 /pdf 폴더 안에 보관됩니다.

어떤 아이디어가 있나요?

편집하다:죄송합니다. 서버에서 Apache를 사용하고 있습니다.

알겠습니다. 목적지에 갈 예정입니다:지금은 다음을 사용하여 작동하고 있습니다.

rewriterule의 rewriteEngine ^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를 사용한 지 6년이 지났지만 여전히 깨끗합니다 :-). 형식이 약간 다를 수 있습니다.

업데이트:

이제 문제가 해결되었습니다. 다음 문제에 대한 몇 가지 옵션이 있습니다.

1/ PDF가 다시 쓰기 규칙에 걸리지 않도록 다른 확장자를 갖도록 PDF 이름을 바꿉니다.클라이언트가 선택한 뷰어에서 열리도록 동일한 MIME 유형을 클라이언트에 푸시하도록 구성해야 합니다.

2/ PDF에 직접 액세스하는 것이 아니라 스크립트의 일부로 다운로드를 수행합니다.양식 제출은 HTTP 요청이므로 리디렉션하지 않고 PDF 내용으로 즉시 응답할 수 있어야 합니다. 다시 다운로드 페이지로 이동합니다.

두 번째 옵션은 다음과 같기 때문에 제가 선택한 것입니다.

  • 사람들이 xx.pdf 대신 xx.pdfx를 요청하면 PDF에 액세스할 수 있다는 것을 알 수 없게 됩니다.
  • PDF를 더 빨리 얻을 수 있습니다(링크를 다시 클릭할 필요가 없습니다).

내 대답은 .NET 웹 사이트에 관한 것이지만 PHP 어딘가에 동일한 구성이 존재한다고 확신합니다.

나는 단순히 request.php?...etc로 Response.Redirect를 수행하는 *.pdf 경로의 HTTPModule을 갖게 될 것입니다(제 경우에는 request.aspx). 그런 다음 버튼에 대한 이벤트 핸들러에서 해당 페이지를 클릭합니다. 표시할 PDF가 무엇인지, 해당 PDF가 인증되었는지 알고 나면 Response.ContentType = [MIME 유형의 pdf]를 수행한 다음 Response.WriteFile(pdfFile), 마지막으로 Response.End()를 수행하면 됩니다.

파일 크기 등 더 나은 기능을 추가할 수 있는 다른 항목도 있습니다.그러나 최소한의 경우에는 이것이 작동합니다.C#에서 이에 대한 코드를 원한다면 약 3분 안에 뭔가를 생각해낼 수 있지만 PHP에서는 상당히 헤매었습니다.저는 HTTPModules과 이를 PHP로 작성하는 방법을 찾기 시작했습니다.

"PHP HTTPModule"에 대한 인터넷 검색 결과는 다음과 같습니다. PHP의 ASP.NET HttpModule과 동일 그래서 제가 조금 틀렸을 수도 있지만 그것이 출발점이기를 바랍니다.

Apache 웹 서버를 사용하는 경우 .htaccess 파일을 사용하세요.mod_rewrite가 활성화되어 있는지 확인해야 하지만 일단 그렇게 하면 다음 두 개의 간단한 줄을 사용하여 모든 파일을 다시 쓸 수 있습니다.

RewriteEngine 켜기 재작성 규칙 ^.pdf$ /rewrite.php [NC,L]

IIS를 사용하는 경우 ISAPI_Rewrite를 사용하여 비슷한 작업을 수행할 수 있습니다.

다른 대안은 PDF를 공개적으로 액세스할 수 없는 디렉터리에 저장하는 것입니다. 그런 다음 PDF 리소스에 대한 요청이 있으면 액세스 거부 오류가 반환되고 해당 파일은 적절한 다운로드 스크립트를 통해서만 액세스할 수 있습니다.

if($user==authenticated){
 //set pdf headers
 echo file_get_contents('actual.pdf');

모드를 다시 쓰지 않고 실제 소스를 숨기는 것이 제가 평소에 하는 일입니다. 이것이 도움이 되기를 바랍니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top