我正在切换到 Amazon Cloudfront 在我的网站上提供图像。为了减少我们最终上线时的负载,我想到通过点击图像 URL 来预热缓存(我从印度发出这些请求,并希望大多数用户从同一区域发出请求,因此不需要在全球所有边缘站点)。
问题是脚本使用curl来请求图像,当我在浏览器中访问相同的URL时,我从Cloudfront得到MISS。因此,Cloudfront 正在为这两个请求制作两个对象副本。
我当前的 Cloudfront 配置将 Content-Type 请求标头转发到源。
我应该如何配置Cloudfront,以便它根本不关心请求标头,并且一旦我发出请求(无论是curl还是使用浏览器),它应该为来自边缘而不是源的相同资源的所有未来请求提供服务。
请求/响应标头-我担心 Cloudfront url 无法从外部访问(直到我们上线),但我发布了请求/响应标头,这应该会给您一个公平的想法。您还可以在原点查看缓存标头 - https://origin.ixigo.com/image/upload/t_thumb,f_auto/r7y6ykuajvlumkp4lk2a.jpg
使用浏览器连续两次请求后的响应
远程地址:54.230.156.66:443
请求 URL: https: //youcannotaccess.com/image/upload/t_thumb,f_auto/r7y6ykuajvlumkp4lk2a.jpg
请求方法:GET
状态代码:200 OK
响应标头
查看源代码
接受范围:字节
年龄:23
缓存控制:公共,最大年龄 = 31557600
连接:保持活动
内容长度:8708
内容类型:图像/jpg
日期:2015 年 11 月 27 日星期五 09:16:03 GMT
ETag :“-170562206”
最后修改时间:2014 年 6 月 29 日星期日 03:44:59 GMT
变化:接受编码
通过:1.1 7968275877e438c758292828c0593684.cloudfront.net (CloudFront)
X-Amz-Cf-Id:fcbGLv8uBOP89qfR5 2OWa-NlqWkEREJPpZpy9ix0jdq8-a4oTx7lNw= =
X-Backend:image6_40
X-Cache:来自云端的命中
X-Cache-Hits:0
X-Device:pc
X-DeviceType:pc
X-Powered-By:xyz
现在使用curl请求相同的url,但让我错过了
curl manu-mdc:cache manuc$curl -I https://youcannotaccess.com/image/upload/t_thumb,f_auto/r7y6ykuajvlumkp4lk2a.jpg
HTTP/1.1 200 OK …
curl cdn cache-control amazon-web-services amazon-cloudfront
我天真地假设,如果我启用了缓存控制,并且客户端使用不同的标头参数值发出了 2 个不同的请求,则浏览器/服务器将独立地服务这两个请求,而无需任何缓存。
我痛苦地发现这实际上不是真的。即使请求标头的参数值发生变化,第一个响应仍然会被缓存并为第二个请求提供服务。
是否有关于哪些构成“高速缓存命中”以及哪些构成“高速缓存未命中”的高速缓存控制行为的明确列表?
我目前可以想到的一些不同因素:
根据我的经验,为了确定请求是否缓存命中,数字 6 肯定会被忽略。
根据我所做的一些研究,在确定某些内容是否缓存命中时似乎会评估因素 1 和 2。
其他人呢?
Cache-control: max-age=0两个 header和之间的浏览器行为有什么区别Cache-control: max-age=-1?
如果浏览器收到 max-age=0,它将立即重新验证缓存。如果浏览器收到 max-age=10,它将在 10 秒后重新验证缓存。max-age=-1 时浏览器的行为是什么?和 max-age=0 一样吗?如果是,为什么我们需要两者?
我研究解决 Android 中离线访问数据的问题,并遇到了 Room 库和 HTTP 缓存控制。我已经在我的应用程序中完成了所有 Retrofit / OkHttp 响应。当没有互联网连接时,哪个实施方案更好?
我可以使用删除方法删除缓存数据。但我想使用过期时间自动删除缓存数据。例如,它应该在 6 小时内被删除。
caches.delete(cacheName).then(function(boolean) {
// your cache is now deleted
});
Run Code Online (Sandbox Code Playgroud) javascript caching cache-control browser-cache service-worker
我在 V5.3 中创建了一个简单的 JMeter 脚本。我在测试计划级别使用 HTTP cookie 和缓存管理器,并且在每次迭代时都选择清除 cookie/缓存。在此之下,我保留了一个线程组,其中包含一个 HTTP 采样器。在线程组级别中,我选择了“每次迭代时使用相同的用户”并执行 1 个线程和 3 个循环计数。
它会在所有 3 次迭代中表现为同一用户,还是将它们视为不同的用户,因为我们已经从测试计划级别的每次迭代中选择了清除 cookie 和缓存?
我喜欢使用 nginx 添加缓存控制标头来获取某些扩展名,例如 .jpg 等,但到目前为止我在网上找到的一些解决方案,我无法让它工作。我会告诉你我尝试过什么。
我在站点的 .conf 文件中的不同位置尝试了以下变体,当我尝试时,站点变成空白,并且在控制台上发现了很多 404 错误。该网站是用 React 开发的。
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 1d;
add_header Cache-Control "public, no-transform";
}
Run Code Online (Sandbox Code Playgroud)
我的conf 文件如下所示。问题是我必须进行反向代理,因为这些站点实际上托管在 Docker 容器中。
server {
server_name mysite.net;
root /usr/share/nginx/html;
location / {
proxy_pass http://web:3005/;
}
location /api/ {
rewrite ^/api(/.*)$ $1 break;
proxy_pass http://api:5005/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
fastcgi_read_timeout 1200;
proxy_read_timeout 1200;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/mysite.net-0001/fullchain.pem; # managed by Certbot …Run Code Online (Sandbox Code Playgroud) Cloudfront is getting a RefreshHit for a request that is not supposed to be cached at all.
它不应该被缓存,因为:
cache-control: max-age=0, no-store;/*),因此这个缓存的资源不是来自某些历史部署知道为什么我会收到 RefreshHits 吗?
我还尝试将 Cache-Control 修改为cache-control no-store, stale-if-error=0,创建一个新的失效/*,现在我看到缓存命中(这次是在 Firefox 中):
我需要一些不在经典ASP应用程序上缓存的页面,但我已经尝试了所有可能的标题组合,似乎没有任何工作:
Response.Expires = -1
Response.ExpiresAbsolute = Now() - 1
Response.CacheControl = "no-cache; private; no-store; must-revalidate; max-stale=0; post-check=0; pre-check=0; max-age=0"
Response.AddHeader "Cache-Control", "no-cache; private; no-store; must-revalidate; max-stale=0; post-check=0; pre-check=0; max-age=0" ' Same as previous line, I know, just in case.
Response.AddHeader "Pragma", "no-cache"
Response.AddHeader "Expires", "-1"
Run Code Online (Sandbox Code Playgroud)
我也尝试重新启动网站和IIS,但无济于事.当我离开页面并使用浏览器的后退按钮返回页面时,它不会重新加载.
我在这里错过了什么?
编辑:经过更多的谷歌搜索,我发现并实现了这个JavaScript解决方案,它不是防弹,因为它是客户端的,我更喜欢服务器端解决方案,但它完成了工作!
不过,我想听听任何服务器端选项.
HTTP 1.1服务器应如何响应HTTP 1.0 Pragma : no-cache中支持的HTTP 1.0请求,而不是HTTP 1.1中支持的头
cache-control ×10
caching ×4
http ×3
android ×1
android-room ×1
asp-classic ×1
cdn ×1
cookies ×1
curl ×1
http-1.1 ×1
http-headers ×1
https ×1
javascript ×1
jmeter ×1
max-age ×1
nginx ×1
nginx-config ×1
protocols ×1
rest ×1