2016-09-08 5 views
0

Pour obtenir que les utilisateurs non authentifiés ne peuvent pas voir les images juste en deviner l'URL (par exemple http://www.test.com/images/123.jpg je stocke toutes les images en dehors du répertoire public et offre une URL qui accepte l'ID unique de l'image et vérifie si l'utilisateur est authentifié:Empêcher navigateur à partir d'images mise en cache

// Laravel code behind http://www.test.com/image/5 
public function getimage($uid) { 

    if(Auth::check()) { 

     $filename = Picture::findorfail($uid)->filename; // e. g. '123.jpg' 
     return response()->download(storage_path('images/' . $filename), null, [], null); 

    } else { 

     return response()->download('images/no_access.jpg', null, [], null); 

    } 

} 

Ainsi, un utilisateur authentifié obtient l'image « 123.jpg » et un utilisateur non authentifié obtient l'image « no_access.jpg » qui est juste un texte rouge « Pas d'accès » sur un fond blanc

Tout fonctionne parfaitement, aussi longtemps que je effacer manuellement le cache de mon navigateur (Chrome dans mon cas) après la déconnexion.

Mais si

  • I login et accéder à l'image via http://www.test.com/image/5 puis-je obtenir l'image '123.jpg' (correct jusqu'à ici)
  • puis appeler et http://www.test.com/image/5 vous déconnecter une fois de plus je devrais obtenir le « no_access.jpg » mais à cause du cache du navigateur, je reçois l'image protégée « de 123.jpg » (cache remplace le contrôle d'autorisation)

je l'ai déjà essayé <meta http-equiv="expires" content="0"> mais sans aucun succès. Agian, si j'efface le cache, tout est parfait - mais les utilisateurs normaux ne le feraient pas.

Comment indiquer au navigateur de ne pas mettre en cache?

Merci d'avance!

+0

Vous pouvez toujours ajouter un index unique aux liens de l'image, de sorte que le navigateur mettra en cache cet index unique, comme ce 'http: //www.test.com/image/5? DfDf23', mais il doit être différent à chaque demande. – JOUM

+0

Solution de contournement splendide! Merci beaucoup ... mais je me demande toujours s'il existe un moyen quelconque pour que le serveur déclenche un effacement du cache du navigateur (par exemple, lors de la déconnexion). – Steevie

+0

'clearing de cache-navigateur' vous voulez mettre le doigt sur le navigateur des utilisateurs? ;) – JOUM

Répondre

1

Essayez de mettre une variable aléatoire à la fin de l'URL

http://www.test.com/images/123.jpg?{{rand()}} 
+0

Solution de contournement splendide! Merci beaucoup ... mais je me demande toujours s'il existe un moyen quelconque pour que le serveur déclenche un effacement du cache du navigateur (par exemple, lors de la déconnexion). – Steevie

1

Vous pouvez empêcher le navigateur de mettre en cache les images, mais vous devez créer un fichier .htaccess et ajoutez ce qui suit à elle:

<filesMatch "\.(jpg|png)$"> 
    FileETag None 
    <ifModule mod_headers.c> 
    Header unset ETag 
    Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" 
    Header set Pragma "no-cache" 
    Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT" 
    </ifModule> 
</filesMatch> 

Hope this helps :)

0

Avec l'idée de @CharlotteDunois je l'ai fait quelques tests et compris que dans Laravel 5.3 les travaux suivants dans toutes mes utilisation-cas es:

return response()->download(
    storage_path('images/' . $filename), 
    null, 
    [ 'Cache-Control' => 'no-cache, no-store, must-revalidate', 'Pragma' => 'no-cache', 'Expires' => '0' ], 
    null 
); 

Le troisième argument représente l'ensemble des en-têtes. Veillez à utiliser le nom d'en-tête (par exemple 'Cache-Control') comme clé de tableau et la valeur d'en-tête (par exemple 'no-cache') comme valeur de tableau. Il existe des solutions proposées sur Internet qui disent ['Cache-Control: no-cache'] ... c'est faux! Vous devez utiliser ['Cache-Control' => 'no-cache']. Bonne chance.

Merci pour toutes les entrées!