2011-07-18 3 views
2

Je construis donc une application qui nécessite une redirection (ou est-ce une réécriture?) Je dois faire celle où l'URL reste la même côté client) à un fichier .php pour toutes les demandes qui se produisent pour les fichiers .pdf dans un répertoire donné sur mon serveur Web (Apache). Cependant, je veux seulement que cette demande soit réécrite si l'utilisateur essaie d'afficher le PDF dans un navigateur (pas le télécharger). J'ai le sentiment que cette deuxième partie n'est pas possible.Rediriger (réécrire?) Toutes les demandes .PDF sur le serveur Apache vers le fichier .php

Quelqu'un a-t-il de bonnes ressources à consulter qui ne décrivent pas seulement la syntaxe que je devrai utiliser, mais aussi ce qui se passe dans les coulisses avec le serveur Apache?

Aussi, est-ce que quelqu'un a une idée sur la façon dont je peux déterminer si le fichier est directement téléchargé ou demandé via le navigateur Web? J'ai l'impression que, lorsque vous accédez à un fichier PDF via un navigateur, il semble le télécharger et l'afficher en utilisant le plugin Adobe Reader, qu'il n'y a aucune distinction qui peut être faite entre les deux.

Meilleures salutations,

Répondre

4
<IfModule mod_rewrite.c> 
    Options +FollowSymLinks 
    Options +Indexes 
    RewriteEngine On 

    # only if not an actual file exist 
    RewriteCond %{REQUEST_FILENAME} !-f 

    # only if not an actual directory exist 
    RewriteCond %{REQUEST_FILENAME} !-d 

    RewriteRule /your-directory/path/(.+)\.pdf $1.php [NC,L] 
</IfModule> 

1. Il est en train de réécrire.

2. Il n'y a pas de distinction entre visualisation et téléchargement. Si une requête est reçue par votre serveur Apache, elle donnera une réponse. La réponse sera celle que produira votre script PHP. Mise à jour: @corretge vous a donné une réponse à ce sujet. Je pense qu'il n'est pas entièrement fiable de se fier aux en-têtes envoyés par le client, mais vous pouvez essayer cette solution.

3. Vous pouvez en apprendre davantage sur Apache's mode_rewrite

+0

Si OP copie votre code exactement, il aura une erreur de serveur. Les commentaires ne peuvent pas commencer au milieu de la ligne. La ligne entière est traitée comme un commentaire si ** premier ** caractère non-espace est '#'. Dans toutes les autres situations, il sera traité comme faisant partie de la directive: http://httpd.apache.org/docs/current/configuring.html#syntax – LazyOne

+0

@LazyOne: Merci! Les a placés là pour l'explication, mais a oublié de dire à l'OP de les enlever. – Shef

2

n'a pas été testé, mais vous pouvez aussi essayer:

RewriteRule ^(.+)\.pdf$ /downloadPdf.php?pdf=$1.pdf [L,NC,QSA] 

Et dans la requête de script /downloadPdf.php pour les en-têtes HTTP avec headers_list() le cas échéant de ceux-ci sont présents:

header("Content-Type: application/force-download"); 
header("Content-Type: application/download"); 

Si les en-têtes de téléchargement sont présents, envoyer le fichier avec

header("Content-Disposition: attachment; filename=\"" . stripslashes($this->ubqDoc[$this->camp]['name']) . "\""); 

Et les en-têtes de téléchargement de force.

Sinon, envoyez le fichier avec cet en-tête

header("Content-Disposition: inline; filename=" . stripslashes($this->ubqDoc[$this->camp]['name'])); 

Vous devez gérer d'autres en-têtes, comme Content-Type et Content-Durée

Lire le manuel fpassthru PHP envoyer sur les fichiers de PHP.

+0

Merci de votre contribution. Alors que l'information ici est certainement utile, l'autre réponse répond plus directement à mes questions. – MoarCodePlz

+0

Ne vous inquiétez pas, mais je suis curieux: Vous recive différents en-tête si PDF est force-téléchargement ou si est montré dans le navigateur? – corretge

+0

Je n'ai pas encore testé pour confirmer, mais selon la réponse ci-dessus les en-têtes sont légèrement différents.Je ferai du reniflage en réseau et afficherai la réponse ici. – MoarCodePlz

Questions connexes