Php 阻止浏览器缓存图像

Php 阻止浏览器缓存图像,php,caching,laravel-5,meta,php-5.6,Php,Caching,Laravel 5,Meta,Php 5.6,为了实现未经验证的用户不能仅仅通过猜测URL来查看图像(例如http://www.test.com/images/123.jpg我将所有图像存储在公共目录之外并提供一个URL,该URL接受图片的唯一id并检查用户是否经过身份验证: // Laravel code behind http://www.test.com/image/5 public function getimage($uid) { if(Auth::check()) { $filename = Pict

为了实现未经验证的用户不能仅仅通过猜测URL来查看图像(例如
http://www.test.com/images/123.jpg
我将所有图像存储在公共目录之外并提供一个URL,该URL接受图片的唯一id并检查用户是否经过身份验证:

// 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”,它只是白色背景上的红色文本“no access”

只要我在注销后手动硬清除浏览器的缓存(在我的情况下是Chrome),一切都会正常工作

但如果

  • 我通过
    http://www.test.com/image/5
    然后我得到了图像“123.jpg”(直到这里都是正确的)
  • 然后注销并调用
    http://www.test.com/image/5
    我应该再次获得“no_access.jpg”,但由于浏览器缓存,我获得了受保护的图像“123.jpg”(缓存覆盖授权检查)
我已经尝试了
,但是没有成功。再者,如果我努力清除缓存,一切都很完美——但是普通用户不会这么做

如何告诉浏览器不要缓存


提前感谢!

尝试在url末尾添加一个随机变量

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

尝试在url的末尾放置一个随机变量

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

您可以阻止浏览器缓存图像,但必须创建
.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>

FileTag无
标题未设置ETag
标题集缓存控制“最大年龄=0,无缓存,无存储,必须重新验证”
标题集Pragma“无缓存”
标题集过期“1984年1月11日星期三05:00:00 GMT”

希望这有帮助:)

您可以阻止浏览器缓存图像,但您必须创建一个
.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>

FileTag无
标题未设置ETag
标题集缓存控制“最大年龄=0,无缓存,无存储,必须重新验证”
标题集Pragma“无缓存”
标题集过期“1984年1月11日星期三05:00:00 GMT”

希望这能有所帮助:)

有了@CharlotteDunois的想法,我做了一些测试,并发现在Laravel 5.3中,以下功能适用于我的所有用例:

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']
。祝你好运


感谢所有的投入

有了@CharlotteDunois的想法,我做了一些测试,发现在Laravel 5.3中,以下功能在我的所有用例中都可以使用:

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']
。祝你好运


感谢所有的投入

您可以向图像链接添加一个唯一索引,这样浏览器将缓存该唯一索引,如下所示
http://www.test.com/image/5?dfDf23
,但每个请求都必须不同。出色的解决方法!非常感谢。。。但我仍然想知道服务器是否会触发浏览器缓存清除(例如,在注销时)。
浏览器缓存清除
你想把手指放在用户浏览器上吗?;)您还可以发送一个标题,告诉浏览器不要缓存它。类似于
header('Cache-Control:no-store,no-Cache,private')
@JOUM:事实上,作为一个用户,如果我的浏览器不缓存来自安全站点的数据,我会很高兴。很抱歉出现这种错觉。您可以在图像链接中添加一个唯一的索引,这样浏览器将缓存该唯一索引,如下所示
http://www.test.com/image/5?dfDf23
,但每个请求都必须不同。出色的解决方法!非常感谢。。。但我仍然想知道服务器是否会触发浏览器缓存清除(例如,在注销时)。
浏览器缓存清除
你想把手指放在用户浏览器上吗?;)您还可以发送一个标题,告诉浏览器不要缓存它。类似于
header('Cache-Control:no-store,no-Cache,private')
@JOUM:事实上,作为一个用户,如果我的浏览器不缓存来自安全站点的数据,我会很高兴。对不起,这是一个错觉。很好的解决方法!非常感谢。。。但我仍然想知道服务器是否有任何方式触发浏览器缓存清除(例如,在注销时)。出色的解决方法!非常感谢。。。但我仍然想知道服务器是否会触发浏览器缓存清除(例如,在注销时)。