我和我的团队正在开发一个Laravel API,该API与使用Apollo客户端来使用GraphQL响应的Vue.js前端通信。
我们遇到了一个将缓存控制标头添加到响应中的问题。
Apollo无法缓存内容,因为响应包含此标头:
Cache-Control: no-cache, private
在php.ini中,我们可以通过PHP禁用发送缓存控制头:
; Set to {nocache,private,public,} to determine HTTP caching aspects
; or leave this empty to avoid sending anti-caching headers.
; http://php.net/session.cache-limiter
session.cache_limiter =
在nginx配置文件中我们找不到任何设置这些头的东西。我检查了全局nginx. conf和我们在sites/available中设置的配置文件。
我可以将此添加到nginx配置中,但它只会添加另一个标头:
add_header Cache-Control "public";
Cache-Control: no-cache, private
Cache-Control: public
如果这个头文件不是来自PHP或nginx,那么它会来自哪里呢?我该如何删除或覆盖它?
- 拉腊维尔5.5
- 民间文学家/拉腊维尔-图形
- PHP 7.1语言
- nginx1.14.0
- Ubuntu 16.04
5条答案
按热度按时间dpiehjr41#
在任何中间件中,您都可以使用此示例
但是我不知道这能解决你的问题
5sxhfpxr2#
在Laravel中,
Cache-Control: no-cache, private
标头在供应商包Symfony http-foundation中通过以下逻辑设置:正如OP在他对@the_hasanov的回答的评论中所说的那样,可以通过实现中间件来覆盖头部。
php artisan make:middleware CachePolicy
1.编辑新的
app/Http/Middleware/Cachepolicy.php
,使其内容为:1.修改
app/http/Kernel.php
以包含新的中间件:bkhjykvo3#
如果你正在使用apache,你可以通过在你的.htaccess中添加来完成
因此它将删除Cache-Control:private并给予如下报头响应
nszi6y054#
请注意,
no cache
并不意味着“不要缓存",no-store
,no cache
“允许缓存存储响应,但要求它们在重用之前重新验证它。”要重新验证,您的服务器响应应该包含
etag
或Last-Modified
。请在此处查看https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching以获取详细信息。例如,在以“Validation is done by using aconditional requestthat include aIf-Modified-Since
orIf-None-Match
request header”开头的部分。因此,您的服务器可能没有这些字段可用于重新验证。private
的意思是“存在于客户端的缓存。它也被称为本地缓存或浏览器缓存。它可以为单个用户存储和重用个性化内容。”@Vardkin的回答正确地指出了它是在computeCacheControlValue()中设置这些字段的,
我想补充的是,在我所附的那些文章中也解释了
must-revalidate
。1.在Cache-Control中
HTTP允许缓存在与源服务器断开连接时重新使用过时响应。must-revalidate是防止这种情况发生的一种方法
1.在HTTP缓存中
过时的响应不会立即被丢弃。HTTP有一种机制,可以通过请求源服务器将过时的响应转换为新的响应...验证是通过使用条件请求完成的
但是我从来没有计算过
no-cache
和must-revalidate
之间有多大的区别,因为它们都需要验证。Which one to use : Expire Header, Last Modified Header or ETags的一个答案是“
ETag
和Last-Modified
stamp之间的差异更具有语义性",这可能会给予一些线索,但如果no-cache
和must-revalidate
都需要验证差异是什么?92vpleto5#
在.htaccess文件中添加以下代码
您可以设置任何您想要的策略,但重要的一点是要记住有“标题总是设置"。