草庐IT

html - Chrome 和 Safari 缓存 302 重定向

coder 2023-08-09 原文

已经有人问过各种各样的问题,但我还没有看到真正的答案。

我们有一个单独的图像服务,我们的网络应用程序使用它来获取它的一些图像。图像服务已经过良好测试并且运行正常。具体来说,我们的应用程序由 domain.com 提供。 img 元素的 src 元素是 images.domain.com/{imageId}。图像服务检索图像的 URL 并发回图像的 HTTP 302 重定向。

该应用程序允许用户更改图像。假设用户 5 将图像 A 作为个人资料图像,并决定通过上传图像 B 来更改它。当用户上传图像时,应用程序缓存会适当失效并更新数据库。应用程序在 POST 之后执行标准重定向,并且用户在更改图像后重定向到的页面中的元素之一类似于:

 <img src="example.domain.com/5">

问题是 Chrome 从不调用 example.domain.com/5 来在初始重定向或定期重新加载页面时检索图像,它只是提供图像来自浏览器缓存的 Aexample.domain.com/5 的独立调用正确返回图像 B,并且硬刷新或清除 Chrome 的缓存会强制 Chrome 请求图像的 src,这会正确返回图像 B。请注意,我不是在谈论在获得 304 Not Modified 响应后从缓存中提供任何图像,我是在谈论 Chrome 决定不访问 img src 并且只返回图像 A。此外,将一些唯一的查询字符串附加到 imgsrc 属性可以解决问题,但这是一种我们宁愿不必做的 hack。

值得注意的是,Firefox 最初也在做同样的事情。最初响应中没有 Cache Control header 。我们向响应 header 添加了一个 Cache Control: no-cache header (并尝试了 no-store),这修复了 Firefox 中的行为,但 Chrome 和 Safari 仍然在不调用图像的 src 的情况下提供过时的缓存图像。

这似乎是 Chromium 中的一个长期存在的错误 (https://code.google.com/p/chromium/issues/detail?id=103458),据称已在大约 6 周前修复,但我们使用的是最新版本的 Chrome。

我们查看了答案 herehere但他们实际上并没有回答这个问题。

每节14.9.1 of RFC 2616 :

If the no-cache directive does not specify a field-name, then a cache MUST NOT use the response to satisfy a subsequent request without successful revalidation with the origin server. This allows an origin server to prevent caching even by caches that have been configured to return stale responses to client requests.

除非我们遗漏了什么或做错了什么,否则 Chrome(和 Safari)似乎不符合 302no-cache header 的 RFC 行为重定向?任何人以前都经历过这种情况或有任何见解?

最佳答案

缓存控制:无存储

我遇到了与您描述的相同的令人抓狂的问题(略有不同,因为它是缺少 cookie 重定向回登录页面),但 Safari 除外。

无奈之下,偶遇this open WebKit bug并看到了致命的评论(终于看到了一线希望):

CachedRawResource now keeps the redirect chain, and has some trivial logic for checking correctness, but it's nowhere near complete (only checks cacheControlContainsNoStore()). And of course other resource types don't have anything.

no-store 添加到我的 cache-control header 中,不再有问题。

关于html - Chrome 和 Safari 缓存 302 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22495231/

有关html - Chrome 和 Safari 缓存 302 重定向的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  3. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  4. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  5. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  6. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  7. ruby - 将 spawn() 的标准输出/标准错误重定向到 Ruby 中的字符串 - 2

    我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])

  8. ruby-on-rails - capybara ::ElementNotFound:无法找到 xpath "/html" - 2

    我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'

  9. ruby - 如何使用 Ruby 将 CSV 文件读入 HTML 表格? - 2

    我正在尝试将一个简单的CSV文件读入HTML表格以在浏览器中显示,但我遇到了麻烦。这就是我正在尝试的:Controller:defshow@csv=CSV.open("file.csv",:headers=>true)end查看:输出:NameStartDateEndDateQuantityPostalCode基本上我只获取标题,而不会读取和呈现CSV正文。 最佳答案 这最终成为最终解决方案:Controller:defshow#OpenaCSVfile,andthenreaditintoaCSV::Tableobjectforda

  10. ruby - 如何使用 Nokogiri 解析纯 HTML 表格? - 2

    我想用Nokogiri解析HTML页面。页面的一部分有一个表,它没有使用任何特定的ID。是否可以提取如下内容:Today,3,455,34Today,1,1300,3664Today,10,100000,3444,Yesterday,3454,5656,3Yesterday,3545,1000,10Yesterday,3411,36223,15来自这个HTML:TodayYesterdayQntySizeLengthLengthSizeQnty345534345456563113003664354510001010100000344434113622315

随机推荐