Domanda

Salve, sto cercando di reindirizzare tutti i collegamenti a qualsiasi file PDF nel mio sito a una pagina con un modulo al suo interno che raccoglie le informazioni dell'utente prima che possano procedere al download/visualizzazione del PDF.

Per esempio

Voglio reindirizzare i file *.pdf nel sito web a request.php?file=name_of_pdf_being_redirected

Dove request.php è la pagina con il modulo che richiede alcuni dettagli prima di procedere.

Tutti i pdf nel sito sono conservati nella cartella /pdf.

Qualche idea?

MODIFICARE:scusa, sto usando Apache sul server.

OK, CI ARRIVO:Adesso funziona usando:

RiswiteEnEngine su Rewriterule ^pdf /(.+. Pdf) $ request.php? File =/$ 1 [r

Ma ora quando vado alla pagina di download quando voglio lasciare che la persona scarichi effettivamente il file, la mia nuova regola è rimandare il collegamento per il download al modulo :-P ahah quindi c'è comunque per lasciare che scarichi il file una volta che il modulo è terminato stato inviato e sei su download.php?

È stato utile?

Soluzione

Puoi provare questo:

  • Sposta i tuoi file in una cartella "esterna" alla tua radice web in modo che nessuno possa accedervi tramite un browser
  • Utilizza le sessioni per rilevare se una persona ha completato il modulo o meno
  • Utilizza uno script di download di file basato su php.Nella sua forma più ingenua, potrebbe assomigliare a questo:
    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

Questa è una tecnica collaudata che ho usato su un sito web.L'esempio di codice è una bozza e necessita di perfezionamento.

Altri suggerimenti

Idee?Potresti iniziare dicendoci quale server web/app stai utilizzando, questo potrebbe aiutarti :-)

In Apache, dovresti essere in grado di utilizzare una RewriteRule per trasformare la richiesta in una forma diversa.Ad esempio, girarsi /pub/docs/x.pdf in request.php?file=/pub/docs/x.pdf si potrebbe fare con qualcosa del tipo:

RewriteRule ^/pdf/(.*)\.pdf/  request.php?file=/$1.pdf

Tieni presente che questo viene dalla memoria (sei anni da quando ho toccato Apache e sono ancora pulito :-), il formato potrebbe essere leggermente diverso.

Aggiornamento:

Ora che hai risolto il problema, ecco un paio di opzioni per il tuo prossimo problema.

1/ Rinomina i PDF con un'estensione diversa in modo che non siano soggetti alla regola di riscrittura.Dovrebbero essere configurati per inviare lo stesso tipo MIME al client in modo che si aprano nel visualizzatore scelto dal client.

2/ Effettuare il download anche come parte dello script, non come accesso diretto al PDF.Poiché l'invio del modulo è una richiesta HTTP, dovresti essere in grado di rispondere immediatamente con i contenuti PDF anziché reindirizzarli Ancora alla pagina di download.

Quella seconda opzione sarebbe la mia scelta poiché:

  • impedisce alle persone di capire che possono accedere ai PDF semplicemente richiedendo xx.pdfx invece di xx.pdf.
  • rende più veloce per la persona ottenere il PDF (non è necessario fare nuovamente clic sul collegamento).

Nota, la mia risposta riguarda un sito Web .NET, ma sono sicuro che gli stessi costrutti esistono da qualche parte in PHP.

Avrei un HTTPModule con un percorso *.pdf che esegue semplicemente un Response.Redirect su request.php?...etc (nel mio caso request.aspx) E poi nel gestore eventi per il pulsante fare clic su quella pagina, quando sai quale pdf visualizzare e che sono autorizzati, esegui semplicemente Response.ContentType = [tipo MIME di pdf], quindi Response.WriteFile(pdfFile) e infine Response.End().

Ci sono altre cose che puoi aggiungere per migliorarlo, come la dimensione del file, ecc.Ma nel caso minimo, questo funzionerebbe.Se vuoi il codice in C# potrei inventare qualcosa in circa 3 minuti, ma in PHP sono abbastanza perso.Inizierei cercando i moduli HTTP e come scriverli in PHP.

Cercare su Google "PHP HTTPModule" porta a questo: Equivalente di ASP.NET HttpModules in PHP quindi potrei sbagliarmi un po', ma spero che questo sia un punto di partenza.

Utilizza un file .htaccess se utilizzi un server web Apache.Dovrai assicurarti di avere mod_rewrite abilitato, ma una volta fatto puoi riscrivere tutti i file usando queste due semplici righe:

RiswiteEngine su Rewriterule ^.pdf $ /rewrite.php [NC, L

Se stai utilizzando IIS, puoi realizzare qualcosa di simile utilizzando ISAPI_Rewrite.

L'altra alternativa è posizionare i tuoi PDF all'interno di una directory che non è accessibile pubblicamente e quindi qualsiasi richiesta effettuata per una risorsa PDF restituirebbe un errore di accesso negato e sarebbe possibile accedere ai file solo tramite lo script di download appropriato.

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

nessuna mod riscrive, nasconde la fonte effettiva ed è quello che faccio normalmente - spero che questo aiuti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top