有一个特定的页面,我希望浏览器始终加载,特别是当用户按下浏览器后退按钮才能访问它.
所以我在这个页面的标题中使用了以下'Cache-Control'指令(直接从我的代码中获取PHP).
$headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
Run Code Online (Sandbox Code Playgroud)
这适用于FF,IE和Chrome,但Safari(5.0.1)似乎忽略该指令并且无法重新加载页面(跨多个用户,因此它似乎不是特定于设置的问题).搜索没有发现任何已知的错误,所以我假设我的结果有些不对劲.
任何指针都将非常感激.
更新:刚刚在SO上找到了这个答案.
尚未尝试过,但看起来很有希望.很奇怪它是身体标签的补充,所以我持怀疑态度.
PHP引擎如何处理仅在文件扩展名方面不同的相同文件之间似乎存在问题.
问题:"If-Modified-Since条件请求返回完整内容不变."
此外,我测量.php扩展加载比带有.xxx扩展的identitcal twin快得多,即使文件内容相同,并且它们的文件扩展名也不同.


"HTTP允许客户端发出条件请求以查看它们所持有的副本是否仍然有效.由于此响应具有Last-Modified标头,因此客户端应该能够使用If-Modified-Since请求标头进行验证.RED已完成这发现资源发送完整的响应,即使它没有改变,表明它不支持Last-Modified验证."
.php
.ast
鉴于:
home.php文件被复制为home.xxx,此扩展名被添加到htaccess以将其识别为PHP文件..php文件监听php.ini,其中新鲜度设置为3小时,非.php文件必须监听htaccess,其中新鲜度设置为2小时,具体如下:
AddType application/x-httpd-php .php .ast .abc .xxx .etc
<IfModule mod_headers.c>
ExpiresActive On
ExpiresDefault M2419200
Header unset ETag
FileETag None
Header unset Pragma
Header set Cache-Control "max-age=2419200"
##### DYNAMIC PAGES
<FilesMatch "\\.(ast|php|abc|xxx)$">
ExpiresDefault M7200
Header set Cache-Control "public, max-age=7200"
</FilesMatch>
</IfModule>
Run Code Online (Sandbox Code Playgroud)
到目前为止这么好并且所有东西都加载了,除了非php文件没有正确缓存,或者它确实缓存但是不能很好地验证,更具体.见附件图片.只有非php文件扩展名会导致错误并加载更慢.
整个page.php加载速度更快,因为其中的所有元素然后从缓存中正确加载,而page.abc在应该缓存时返回完整请求,这意味着整个页面速度较慢.
底线:应该更改什么,以便消除If-Modified-Since条件请求返回完整内容不变?
我的ini文件中有以下内容:
cache.regions = default_term, second, short_term, long_term
cache.type = memory
cache.second.expire = 1
cache.short_term.expire = 60
cache.default_term.expire = 300
cache.long_term.expire = 3600
Run Code Online (Sandbox Code Playgroud)
这在我的__init__.py:
from pyramid_beaker import set_cache_regions_from_settings
set_cache_regions_from_settings(settings)
Run Code Online (Sandbox Code Playgroud)
但是,我不确定如何在我的视图/处理程序中执行实际缓存.有装饰师吗?我认为responseAPI中会有一些东西cache_control可用 - 它指示用户缓存数据.不缓存服务器端.
有任何想法吗?
我无法找出缓存控制标头,用于提供用于使用AppCache的HTML5应用程序的文件,该应用程序适用于所有主流浏览器(Chrome/Safari,Opera,Firefox,IE10).
我遇到的问题是,当某种标题适用于某个浏览器时,另一种标题可能完全破坏.例如:
Cache-Control: private
Run Code Online (Sandbox Code Playgroud)
在Webkit浏览器上正常工作,它们刷新并加载更新的文件并在缓存中替换它们.然而,Firefox和IE10都拒绝加载新文件,而是从缓存中获取它们(不是appcache!),即使它们识别出更新的清单文件.
Cache-Control: no-cache
Run Code Online (Sandbox Code Playgroud)
也可以在webkit浏览器上正常工作,也可以使Firefox和IE10加载新文件,而不是从缓存中加载它们,但会破坏脱机功能,因为它们本质上不会缓存(如标题所示)文件,即使它们在appcache清单中明确提到.
最后,我试过了
Cache-Control: must-revalidate
Run Code Online (Sandbox Code Playgroud)
其中的工作方式类似,no-cache但Firefox和IE10没有保留文件以供离线使用,而是不保留它们的Webkit.
发送没有Cache-Control标头会产生与privateor 相同的结果public,因为我假设浏览器只是假定它是标准方式.
那我错过了什么?public具有相同的结果,private并且设置max-age不是一个选项,因为更新(包括修补程序)不会定期传递,而是在可用或需要时传递.
有人可以了解哪个Cache-Control标头是正确使用的,哪个适用于所有浏览器?
我正在阅读有关不可变标头的内容,我发现这篇文章说:
缓存控制:max-age=365000000,不可变
当支持不可变的客户端看到此属性时,它应该假设该资源(如果未过期)在服务器上未更改,因此不应为其发送条件重新验证(例如 If-None-Match 或 If-Modified-Since)来检查更新。纠正可能的损坏(例如 Firefox 中的移位重新加载)从不使用条件重新验证,如果您担心不可变对象已损坏,那么对它们进行处理仍然有意义。
我无法理解这句话“如果未过期,则在服务器上未更改,因此不应发送有条件的重新验证”
默认情况下,客户端在 max-age 到期之前不会发送重新验证。
那么首先定义不可变的意义何在呢?
我想告诉ASP.NET Core为Cache-ControlMVC控制器提供的所有响应添加公共和相关标头,包括HTML页面和Web API响应.我不希望策略应用于缓存静态文件; 那些我想要缓存的人.
在特殊情况下,我想禁用缓存,相当于将此属性应用于所有控制器:
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
Run Code Online (Sandbox Code Playgroud)
我可以创建一个具有此属性的基本控制器,并从中派生所有其他控制器.我想知道是否存在基于配置的方法,以避免需要这样的基本控制器.
我已将 AWS CloudFront 设置为从同一域提供静态内容和API 服务器。这意味着我有两种行为,一种为 API 网关/api提供服务,另一种为所有其他路径提供来自 S3 的内容。
问题是我不希望 CF 从 API 服务器缓存任何东西。我很惊讶地发现似乎没有一个“主设置”来完全禁用缓存行为;相反,文档指的是Cache-control: no-cache在原点上使用或在 CF 行为中打开“基于所有标头的缓存”。
但是,这些解决方案中没有一个完全满足我的要求,即不缓存和传递所有标头。如果我添加Cache-control: no-cache到我的起源,CF似乎尊重这一点,但仍然存在CF设置的问题。CF 有一个设置“基于标题的缓存:全部/无/白名单”。文档说要禁用缓存,应该使用“全部”,这是有道理的(尽管与实际设置相比有点模糊:禁用缓存:开/关)。但是,一旦我将此设置设置为“全部”,整个行为就会被禁用,我的 API 请求根本不会到达 API 网关,但默认为用于非 API 请求的 S3 行为。我找不到对此的任何解释,就像整个行为失败或在没有解释的情况下被禁用。
另一个问题是“基于缓存”中不存在的标头不仅会从缓存中排除(无论如何我都不想要),而且还会在转发之前从请求中删除。这对于缓存按预期工作可能是有意义的,但是由于我不想要任何缓存,因此必须确保将我使用过的所有标头列入白名单是非常令人沮丧的。依靠“全部”比必须确保白名单始终是最新的感觉要好得多。
所以:
1) 是否有更好、更清晰的方法来完全禁用 CloudFront 分配的一个路径的缓存?理想情况下,它甚至不应该依赖于设置某些标头的源,它应该完全禁用在配置的路径中缓存请求的任何尝试。
2) 为什么当我在“Cache based on headers”框中选择“All”时,我的整个 API 网关目标都被禁用了?这里发生了什么事?
这是我的用例:
我们的应用程序也可以离线使用。我尝试了一些类似的库flutter_advanced_networkimage,flutter_cache_manager但我遇到了相当大的延迟,而且大多数时候应用程序崩溃了。
根据文档:
Clear-Site-Data 标头清除与请求网站关联的浏览数据(cookie、存储、缓存)
现在尝试一下,您可以在屏幕截图(Firefox v76)中看到,在Clear-Site-Data浏览器中的“响应”部分中进行了设置,但是您仍然可以看到资产“已缓存”:
注意:即使在一段时间后来回导航后,缓存的资源似乎也没有被清除。
我的印象是这会立即发生,但我无法让它发挥作用。这应该立即发生还是在一段时间后发生,或者我只是错过了其他一些事情?
为关心的人更新:
Clear-Site-Data似乎只适用于localhost或https
http cache-control browser-cache http-headers clear-site-data
我正在使用 apihttp://exchangeratesapi.io/来获取汇率。
他们的网站询问:
请尽可能缓存结果,这将使我们能够在没有任何速率限制或 API 密钥要求的情况下保持服务。
-来源
然后我发现了这个:
默认情况下,对 Exchangeratesapi.io API 的所有请求的响应都会被缓存。这可以显着提高性能并减少服务器的带宽。
- github上某人的项目,不确定是否准确
我以前从未缓存过某些东西,这两个语句让我很困惑。当 API 的网站说“请缓存结果”时,听起来缓存是我可以在请求中fetch或以某种方式在前端执行的操作。例如,将结果存储在本地存储中的某种方式。但我找不到任何有关如何执行此操作的信息。我只找到了有关如何强制响应不缓存的资源。
第二个引言听起来好像缓存是 API 在其服务器上自行执行的操作,因为它们将响应设置为自动缓存。
如何按照 api 站点的要求缓存结果?
cache-control ×10
caching ×7
header ×2
http ×2
http-headers ×2
asp.net-core ×1
flutter ×1
image ×1
php ×1
pylons ×1
pyramid ×1
python ×1
safari ×1
validation ×1
web ×1