Bonjour,
Je bloque sur un problème d'url, et je sais pas si ce que je cogites est logique / possible ou pas.
J'ai un lien
<a href="www.monsite.fr/monDossier/monFichier020.pdf">mon pdf</a>

Après lecture d'une multitude de post et tuto sur l'URL rewriting je conclu que grâce à un htaccess tel que celui-ci :

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^inconnu.html$  /monDossier/monFichier020.pdf [L]

Si je créais un lien :
<a href="www.monsite.fr/monLienRewrtite.html">mon pdf</a>

Ce dernier va s'afficher dans la barre d'adresse du navigateur et va bien m'ouvrir monFichier020.pdf

Ce que je souhaites faire est l'inverse, c'est à dire :
Lorsque je clique sur le lien ci dessous :
<a href="www.monsite.fr/monDossier/monFichier020.pdf">mon pdf</a>

J'arrive à récupérer monFichier020.pdf, mais que l'adresse dans le navigateur affiche :
"www.monsite.fr/monLienRewrite.html"


Merci
Modifié par urlien (13 Apr 2017 - 23:13)
Biensur si ma question n'est pas claire, je me tiens à votre entière disposition Smiley smile .
J'avoue que je m enquiquine un peu avec ce problème
Bonne soirée ))
Bonjour,
N'ayant que très peu de succès avec mon post précédent, je me permet de compléter :
Ce lien,
<a href="www.monsite.fr/monDossier/monFichier020.pdf">mon pdf</a>

Renvoi vers un fichier PDF qui se différencie grâce au "020".
Si un utilisateur modifie '020' par '030' par exemple, il accédera au fichier pdf monFichier030.pdf. Cà, j'aimerai l'éviter à tous pris.
Depuis mon premier post, j'ai cherché multiple possibilité :
- Je me suis rendu à l'évidence qu'il n'était pas possible d'avoir une URL inversée
- Du coup grâce à d'autre avis je me suis orienté vers la Session :

<?php
	if (isset($_GET['invoices']) AND isset($_GET['repeter']))
	{
		$_GET['repeter'] = (int) $_GET['repeter'];
 
/*J'initialise le nom de fichier PDF*/
		$fichier = $_GET['invoices'].'.pdf';
 
/*Creation ID unique a chaque modification de paramètre GET*/
		session_id(uniqid()); 
		session_start();
 
		if ($_GET['repeter'] >= 1 AND $_GET['repeter'] <= 2) 
		{	
			for ($i = 0 ; $i < $_GET['repeter'] ; $i++)
			{
			header("Location:  http://monsite.fr/invoices/".$fichier);
 
/*Fermeture de Session*/
			session_destroy();
			exit();
			}
		}
	}
	else
	{
		echo 'Une erreur s\'est produite !';
	}
?>


Mais là aussi je bloque. Je n'arrive pas a savoir ou mettre en place mon test pour valider ou non la requête. En fait si l'ID de Session change, cela veut dire que le GET a été modifié.
Avez-vous un conseil à me donner ?

Enfin, j'ai garder en réserve une solution pas très sécure, donc je voudrais l'éviter, c'est de perdre mon paramètre dans une grande chaîne de caractère
http://www.monsite.fr/dossier/page.php?dossier=123er23aze3a5z351qs51351f53'monidentifiant'123e3258r323f357385f132f
Identifiant que je récupère dans ma page.php par la suite

- Merci de vos retours - Smiley biggol
salut,

quel est le but exact ?
cacher la véritable url du fichier pdf ?

si c'est le cas tu peux très bien avoir une table avec la liste des fichiers et leurs emplacements (une table avec une clef primaire Smiley cligne ).

ensuite tu orientes le visiteur vers un fichier php qui prend en paramètre l'id du fichier et l'utilise pour envoyer le fichier au navigateur (c'est l'exemple N° 1 de la doc de la fonction header).

un id est peu prédictible, mais cela n’empêche pas le visiteur de jouer avec l'url (avec ou sans ré-écriture).

Dans ce cas tu peu t'orienter vers un hash quelconque histoire d'avoir une chaîne globalement unique pour identifier ton fichier (du coup une colonne en plus dans la base avec une contrainte unique + index histoire de faire bien Smiley cligne ).

L'url est un peu moins sexy mais cela fonctionne.

La solution avec une session : tu affiches une page avec un lien et un jeton aléatoire (ou presque, par exemple avec uniqid), en session tu gardes la correspondance jeton fichier. La pour le coup un même fichier ne peux pas être deux fois avec le même jeton (suppression du jeton en session avant / après le dl).

ces solutions nécessite forcément l'emploi d'un fichier php qui va pousser le fichier (pdf ou pas) vers le client.

il est possible de ré écrire l'url pour rendre la chose un peu plus sympa que dl.php Smiley cligne


juste pour info sur la la ré-écriture d'url
la règle suivante
RewriteRule ^inconnu.html$ /monDossier/monFichier020.pdf [L]
signifie que lorsque le serveur rencontre l'url http://tonsite.com/inconnue.html (et pas autre chose) il va servir /monDossier/monFichier020.pdf

donc cela répond à ton besoin, l'url n'affiche pas le chemin du PDF.
Le problème de cela c'est que c'est jouable pour un fichier mais pas pour 50.

tu peux imaginer une règle dynamique

RewriteRule ^download-(\d.+).html$ /monDossier/monFichier$1.pdf [L]

et la du coup tu auras des url download-42.html, download-1337.html qui vont servir les pdf monFichier42.pdf et monFichier1337.pdf dans le dossier /monDossier
Bon cela fige le nom des fichiers PDF mais c'est jouable.

Le truc c'est que cela ne répond pas à la problème de ton dernier message : na pas pourvoir deviner le numéro d'un fichier (la faut se tourner vers la solution des id / jeton aléatoire).

@+
Modérateur
Après si tu veux sécuriser proprement, il ne faut pas distribuer les fichiers par apache, mais par php, en vérifiant au préalable les droits d'accès.
Le but exact est le suivant :
Actuellement j'utilise une solution emailing, cette dernière ne me permet pas d'attacher une pièce jointe personnalisée à mes messages.
J'envoi donc un message à mes clients avec un lien ( qui lui est personnalisable grâce à une balise) de téléchargement vers les fichiers PDF.
C'est PDF sont des factures donc protection oblige Smiley smile
Voilou.
J'ai pas trop saisi l'histoire du jeton, mais je vais continuer à réfléchir par la puisque j'ai déjà entamer mes recherche avec les sessions !
Merci en tout cas pour cette réponse
Tu ne pourras pas empêcher potentiellement d'autres utilisateurs/bots d'accéder à tes fichiers si tu dois les lier dans un mail, même chose si tes fichiers existent physiquement sur le serveur et sont accessible sans mot de passe.

Le mieux c'est de faire un compte pour chaque client avec à l'intérieur un espace pour retrouver les factures. Les pdf des factures peuvent être générés à la volée, il n'ont pas besoin d'exister réellement sur le serveur.
Merci pour ce retour.
Le truc c'est que chaque client a déjà un espace perso ou la facture se trouve. Donc ils y ont accès en s'enregistrant avec leur MDP.
Ce que je souhaite faire, c'est facilité l’accès a cette facture en même temps que l'envoi du mail. Le top serait de l'avoir en pièce jointe mais mon logiciel emailing ne le permet pas.
Pour générer à la volée, cela n'est pas possible pour le moment.
Ce que je souhaite c'est une solution valable et ponctuelle.

L'utilisation d'une Session comme le propose moogliBZH n'est donc pas conseillée ?
kustolovic : peux-tu ,préciser ? 'distribuer par PHP' ?

Merciiiii sususisi
Une solution possible est de générer une url à la volée pour chaque facture avec des paramètres qu'un utilisateur ne pourra pas deviner. Par exemple ovh fait des urls comme ceci pour donner l'accès à une facture :

/order/facture.pdf?reference=FR174897323132&passwd=Tkjhsd

(Inutile d'essayer, l'url est fausse).

Ensuite je suppose que tu pourrais avoir une simple page permettant de télécharger le document ou déclencher le téléchargement directement avec js.

Il faut bien avoir conscience que quelqu'un récupérant l'url d'un façon ou d'un autre aura accès à la facture et que ces urls peuvent être indexés par les moteurs de recherche.
vu ton cas d'usage oublie la session.

Tu peux te baser sur l'exemple du bzh qui revient à la solution du jeton unique par fichier.

kustolovic indique (grosso modo) la solution indiquée dans la doc de la fonction header (dont je t'ai fournit le lien plus haut) en ajoutant un contrôle sur l'identité de la personne qui demande le fichier.
En clair, une personne est connecté sur le site et demande le fichier.
Si tu veux une authentification automatique il faut vérifier que le lien soit utilisé par la bonne personne.
Il n'y a pas beaucoup de solution à partir d'un lien, tu peux passer un id de fichier un jeton qui correspond à l'utilisateur mais tu sera pas prémunie contre un vol d'email / sniffing réseau etc.

La solution la plus sécurisé c'est le message laconique indiquant la disponibilité de la facture avec un lien vers celle ci.
lorsque tu arrives sur la page tu demandes les informations de connexion (s'il n'y a pas déjà une session active) puis envois le fichier.

Dernière solution, faire évoluer le chose qui envoie l'email pour envoyer une pièce jointe (c'est pas vraiment compliquer d'envoyer une pièce jointe il y a même de lib pour y aider comme phpmailer Smiley cligne ).

@+
Ola et encore merci.
Oui, je vais développer l'envoi de mail avec pièce jointe prochainement. Nous avions souhaité passé par un système d'emailing car nous avions des soucis de SPAM et le temps nous a manqué par la suite. Nous travaillons sur une seconde version de notre site, et cela fait partie des priorités.

Pour notre problème, j'ai fait un mix des infos du coup j'envoie un lien de la forme :

http://www.monsite.fr/dossierPDF/aazeaz5fe2r3d33z56502012rrtTf5fazd-1.pdf


J'ai """caché l'ID"""" dans ce lien. Ce dernier renvoi sur une page PHP qui sélectionne le bon PDF et l'affiche dans le navigateur.


<?php	
	if (isset($_GET['invoices']) AND isset($_GET['repeter']))
	{
		$_GET['repeter'] = (int) $_GET['repeter'];
		$year = date(Y);
		$month = date(m);
		$str = $_GET['invoices'];
		$cc = substr($str, 10, -10);
		$invoice = 'CC'.$cc.'-F'.$year .$month.'.pdf';

		if ($_GET['repeter'] >= 1 AND $_GET['repeter'] <= 2) 
		{	
			for ($i = 0 ; $i < $_GET['repeter'] ; $i++)
			{
			header('Content-type: application/pdf');
			header('Content-Disposition: inline; filename="facture.pdf"');	
			header('Content-Transfer-Encoding: binary');
			header('Accept-Ranges: bytes');
			readfile($invoice);
			
			/******* CREATION fichier.txt *******/
			$today = date("d/m/Y H:i");
			$file = fopen($cc.'.txt', "w");
			fwrite($file, 'ouvert le ' .$today);
			fclose($file);
			exit();
			}
		}
	}
	else
	{
		echo 'Une erreur s\'est produite !';
	}
?>


Je créai également un petit *.txt pour voir qui a ouvert le lien.
Enfin dans mon htaccess je met un nofollow et no index


Options +FollowSymlinks
RewriteEngine on
RewriteRule ^(\w+)-(\d+).pdf$ /monDossier/maPage.php?invoices=$1&repeter=$2 [L]
Header set X-Robots-Tag "noindex"


Voilà oukjensuis !

Merci à tous et toutes