为了实现未经身份验证的用户无法仅通过猜测 URL(例如 http://www.test.com/images/123.jpg
)来查看图像,我将所有图像存储在公共(public)目录之外,并提供一个接受图片唯一 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
登录并访问图像然后我得到图像“123.jpg”(正确到这里) - 然后注销并调用
http://www.test.com/image/5
再一次,我应该得到“no_access.jpg”,但由于浏览器缓存,我得到 protected 图像“123.jpg”(缓存覆盖授权检查)
我已经试过了 <meta http-equiv="expires" content="0">
但没有任何成功。 Agian,如果我硬清除缓存,一切都是完美的 - 但普通用户不会那样做。
如何告诉浏览器不要缓存?
提前致谢!
最佳答案
尝试在 url 的末尾放置一个随机变量
http://www.test.com/images/123.jpg?{{rand()}}
关于php - 防止浏览器缓存图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39398119/