【问题标题】:Prevent browser from caching images防止浏览器缓存图片
【发布时间】:2016-09-08 18:44:34
【问题描述】:

为了实现未经身份验证的用户无法仅通过猜测 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”,它只是一个白色背景上的红色文本“No access”。

只要我在注销后手动硬清除浏览器(在我的情况下为 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">,但没有任何成功。 Agian,如果我硬清除缓存,一切都会完美 - 但普通用户不会这样做。

如何让浏览器不缓存?

提前致谢!

【问题讨论】:

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

标签: php caching laravel-5 meta php-5.6


【解决方案1】:

尝试在网址末尾放一个随机变量

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

【讨论】:

  • 出色的解决方法!非常感谢......但我仍然想知道服务器是否有任何方式触发浏览器缓存清除(例如在注销时)。
【解决方案2】:

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

希望这会有所帮助:)

【讨论】:

    【解决方案3】:

    根据@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
    );
    

    第三个参数表示标题集。小心使用 header-name(例如'Cache-Control')作为数组键和 header-value(例如'no-cache')作为数组值。互联网上有建议的解决方案说['Cache-Control: no-cache'] ...这是错误的!你必须使用['Cache-Control' =&gt; 'no-cache']。祝你好运。

    感谢大家的意见!

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      相关资源
      最近更新 更多