2016-09-08 8 views
0

Чтобы добиться того, что пользователи, не прошедшие проверку подлинности, не могут просматривать изображения, просто угадывая URL (например, http://www.test.com/images/123.jpg Я храню все изображения за пределами общедоступного каталога и предлагаю 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 тогда я получаю изображение «123.jpg» (правильный, пока здесь)
  • затем выйти из системы и вызвать http://www.test.com/image/5 еще раз, то я должен получить «no_access.jpg», но из-за кэша браузера я получаю защищенное изображение «123.jpg» (кэш отменяет проверку авторизации)

Я уже пытался <meta http-equiv="expires" content="0">, но без какого-либо успеха. Агиан, если я сильно очищу кеш, все идеально, но обычные пользователи этого не сделали.

Как сообщить браузеру не кэшировать?

Заранее благодарен!

+0

Вы можете добавить уникальный URL-адрес для ссылок на изображение, поэтому браузер будет кэшировать этот уникальный индекс, например этот 'http: //www.test.com/image/5? DfDf23', но он должен быть другим по каждому запросу. – JOUM

+0

Великолепное обходное решение! Большое спасибо ... но я все еще задаюсь вопросом, есть ли способ, которым сервер запускает очистку кеша браузера (например, при выходе из системы). – Steevie

+0

«Очистка браузера-кеша» вы хотите поместить палец в браузер пользователей? ;) – JOUM

ответ

1

Попробуйте положить случайную переменную на конце URL

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

Великолепное обходное решение! Большое спасибо ... но я все еще задаюсь вопросом, есть ли способ, которым сервер запускает очистку кеша браузера (например, при выходе из системы). – Steevie

1

Вы можете предотвратить браузер кэширование изображений, но вы должны создать .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> 

Надеется, что это помогает :)

0

с идеей @CharlotteDunois я сделал некоторые испытания и выяснил, что в Laravel 5.3 следующие работы во все моем потребительном КАСЕ 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']. Удачи.

Спасибо за все входные данные!

 Смежные вопросы

  • Нет связанных вопросов^_^