2016-09-08 11 views
0

URL을 추측하여 인증되지 않은 사용자가 이미지를 볼 수 없도록하려면 (예 : http://www.test.com/images/123.jpg) 모든 이미지 을 공용 디렉토리 외부에 저장하고 그림의 고유 ID를 허용하는 URL을 제공하고 사용자가 인증됩니다 :브라우저가 이미지를 캐싱하지 못하도록하십시오.

// 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); 

    } 

} 

따라서, 인증 된 사용자가 '123.jpg'과 인증되지 않은 사용자가 이미지를 단지 빨간색 텍스트를에 '없음 액세스'없다 'no_access.jpg'를 얻는 이미지를 얻을 수 흰색 배경입니다.

모든 것이 완벽하게 작동합니다. 로그 아웃 한 후 내 브라우저의 캐시 (내 경우에는 Chrome)를 수동으로 하드 캐시 해 둡니다.

하지만 로그인 http://www.test.com/image/5를 통해 이미지에 액세스

  • 이라면 나는
  • 다음 한 번 더 그때 내가 가야 로그 아웃 http://www.test.com/image/5를 호출 이미지 (여기까지 올바른) '123.jpg'를 얻을 'no_access.jpg'하지만 브라우저 캐시의 내가 보호 된 이미지 '123.jpg'를 얻을 수 있기 때문에 (캐시가 인증 검사를 무시)

이미 <meta http-equiv="expires" content="0">을 시도했지만 어떤 성공없이. Agian, 캐시를 하드 캐시하면 모든 것이 완벽하지만 일반 사용자는 그렇게하지 않을 것입니다.

어떻게 캐시하지 않도록 브라우저를 설정합니까?

미리 감사드립니다.

+0

고유 한 색인을 이미지 링크에 항상 추가 할 수 있으므로 브라우저는 'http : //www.test.com/image/5? dfDf23'과 같이 고유 색인을 캐시하지만 다른 값을 사용해야합니다 각 요청마다. – JOUM

+0

화려한 해결 방법! 고마워요.하지만 서버가 브라우저 캐시 지우기 (예 : 로그 아웃시)를 트리거하는 방법이 있는지 궁금합니다. – Steevie

+0

'브라우저 캐시 삭제 '사용자의 브라우저에 손가락을 넣고 싶습니까? ;) – JOUM

답변

1

당신은 이미지를 캐싱에서 브라우저를 방지 할 수 있습니다

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

화려한 해결 방법! 고마워요.하지만 서버가 브라우저 캐시 지우기 (예 : 로그 아웃시)를 트리거하는 방법이 있는지 궁금합니다. – Steevie

1

URL의 끝에 임의의 변수를 넣어 시도,하지만 당신은 .htaccess 파일을 생성하고 여기에 다음을 추가해야합니다 :

<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> 

희망이 도움이 :) @CharlotteDunois의 아이디어와

0

나는 몇 가지 테스트를하고 알아 냈 그 Laravel 5.3 내 모든 사용-CAS에 다음 작품 es :

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

세 번째 인수는 헤더 집합을 나타냅니다. 배열 키로 헤더 이름 (예 : 'Cache-Control')을 사용하고 배열 값으로 헤더 값 (예 : 'no-cache')을 사용하도록주의하십시오. ['Cache-Control: no-cache'] ... 그 말은 틀린 인터넷상의 해결책이 있습니다! ['Cache-Control' => 'no-cache']을 사용해야합니다. 행운을 빕니다.

모든 정보를 제공해 주셔서 감사합니다.