它似乎只有javascript和CSS不缓存...但图像缓存.
我正在使用Firebug,当我刷新页面时,我在Firebug中注意到js/css 有很多200个HTTP响应,但我收到的所有图像都有304个HTTP代码(内容未修改).所以看来我的JS和CSS不是缓存.
此外,当使用YSlow帮助确定我的JS/CSS内容没有缓存的问题时,它告诉我:
有4个组件配置错误的ETag
下面列出的是我的.htaccess文件
Options -Indexes
Options +FollowSymLinks
# Enable ETag
FileETag MTime Size
# Set expiration header
ExpiresActive on
ExpiresDefault "access plus 1 week"
# Compress some text file types
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml application/x-javascript text/javascript application/javascript application/json
# Deactivate compression for buggy browsers
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# Set header information for proxies
Header append Vary User-Agent
Run Code Online (Sandbox Code Playgroud)
知道我的.htaccess访问文件有什么问题阻止它缓存我的CSS或JavaScript吗?
我遇到了AJAX和Internet Explorer 9的问题:它在收到对初始etagged GET的响应后停止轮询我们的服务器.
它假装发出响应请求,如"响应HTTP/1.1 304未修改,状态200正常"(是的,一个响应中的两个不同的状态代码)和相同的ETag(应该随时间变化)但它们实际上都没有出现在服务器中日志.
此问题仅出现在IE中,相同的代码在Chrome和FF中运行良好.
也许将{cache:false}传递给jQuery.ajax()可能有所帮助,但我想知道是否有办法在服务器端解决问题.
我们的ETag使用可能存在错误.
谢谢!
我的网络服务器中有一个文件,我每次访问它时都会将其下载到我的应用程序,因为它可能会更改文件内容但是如果它被更改我想下载那个时间只有这样才能保存带宽而且幸运的是那是什么此ETag和If-None-Match 标头字段用于.
注意:
当我在Chrome 中使用高级REST客户端应用程序尝试上述步骤时,它应该可以正常工作但是当我在iOS中尝试时,我总是得到响应代码200,但它应该给我304后续请求.
这是我使用的示例代码
var request1 = NSMutableURLRequest(URL:NSURL(string: "http://10.12.1.101/Etag/ringtone1.mp3")!)
let Etagvalue="\"36170-52c1cc36d9b40\""
var session1 = NSURLSession.sharedSession()
request1.HTTPMethod = "GET"
var err: NSError?
request1.addValue(Etagvalue, forHTTPHeaderField: "If-None-Match")
var task = session1.dataTaskWithRequest(request1, completionHandler: {data, response, error -> Void in
print("response: \(response)")
})
Run Code Online (Sandbox Code Playgroud)
这是回复
响应:可选({URL:http : //10.12.1.101/Etag/ringtone1.mp3 } {状态代码:200,headers {"Accept-Ranges"= bytes; Connection ="Keep-Alive";"Content-Length" = 221552;"Content-Type"="audio/mpeg"; Date ="Wed,2016年2月24日14:57:53 GMT"; Etag ="\"36170-52c1cc36d9b40 \"";"Keep-Alive"=" timeout = 5,max = 100";"Last-Modified"="Fri,2016年2月19日10:15:33 GMT"; …
在React Native应用程序中实现以下方案的最佳方法是什么?
React Native是否有一个开箱即用的组件?如果没有,人们用来处理这个问题的最常见方式是什么?
使用etags/stale会有什么好处?/ fresh_when?而不是页面缓存(在文件缓存上)?
Apache自动处理静态文件的etags,但即使它没有,页面缓存仍然会更好,因为Rails应用程序甚至不会被调用.
那么,在什么情况下我会使用Rails提供的方法(过时?/ fresh_when?)?
我能想到的唯一原因是计算ETag
可能很昂贵.如果页面变化非常快,浏览器的缓存很可能会被无效ETag
.在这种情况下,计算这ETag
将浪费时间.另一方面,304
在可能的情况下给出响应可以最小化传输所花费的时间.ETag
当用Django实现时,CommonMiddleware
什么时候可能成为净胜利者有什么好的指导方针?
给定一个文件作为http请求的一部分返回.为该文件创建ETag的正确方法是什么?
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19
我看过它有几种方法
由于Rails 4删除了页面缓存和动作缓存,我想知道什么是Rails 4方式缓存一个没有变量且在视图中只有html的动作?我应该在视图中片段缓存静态html吗?当没有模型将其设置为过期时,如何设置etag/fresh_when?我很难找到一个示例或约定来缓存什么应该是最容易缓存的页面.
需要注意的是,虽然视图完全是静态的,但页面仍然具有动态导航栏,具体取决于用户是否已登录.你如何处理这样的静态页面,而不采取行动缓存,因为它已被删除,并且约定已设置为不使用gem版本?
例:
class HomesController < ApplicationController
def index
end
end
Run Code Online (Sandbox Code Playgroud)
家/ index.html.erb
<div>A bunch of normal html tags with no erb</div>
Run Code Online (Sandbox Code Playgroud)
编辑: 基于@ severin的回答和我自己的研究,这是我到目前为止所提出的.
class HomesController < ApplicationController
def index
fresh_when(["some-identifier", current_user, flash])
end
end
Run Code Online (Sandbox Code Playgroud)
此外,我正在使用https://github.com/n8/bust_rails_etags重置部署后的所有etags,因为视图可能在部署之间发生了变化.我认为这很好地涵盖了etag,虽然我仍然很好奇是否会自动包含一些关于视图的标识符以及是否需要"some-idnetifier"?是否会出现问题,有时current_user和flash会为零?
现在关于片段缓存静态内容的第二点.我假设我做了:
cache "v1" do
all my html
end
Run Code Online (Sandbox Code Playgroud)
我必须记住在页面更改时始终更改缓存标识符,否则我的应用程序将提供过时的内容.任何方式自动化这个或已经由rails处理?只是缓存最后一次更新视图或更聪明的东西会很好,所以我不必跟踪我的静态内容何时被更改.
是否可以通过安全的HTTPS连接将HTTP缓存用于条件GET请求?我已经通过非安全HTTP进行缓存,但是当我切换到HTTPS时,浏览器会停止发送if-none-match和if-modified-since标头,因此缓存会中断.我尝试了各种Cache-Control设置,如public,max-age = 3600和whatnot,no dice.
这种情况在Safari和Chrome中都会发生,因此我假设SSL以某种方式打破了它.是否不允许通过SSL进行缓存?
而且要明确的是,服务器确实正确设置了etag和最后修改的标头,但根据Chrome开发人员的工具,浏览器不会在请求中发送if-none-match和if-modified-since.
谢谢你的帮助.
如果我设置nginx使用gzip,它会删除任何etag标头.
这背后的原因是,鉴于gzip具有各种压缩级别,相同的资源不能逐字节相同.
但是nginx也删除了一个弱etag,这意味着资源在语义上是等价的.这似乎是nginx的错误行为.
我错过了什么吗?如果没有,有没有办法解决这个问题?
etag ×10
caching ×6
http ×5
.htaccess ×1
apache ×1
c# ×1
django ×1
gzip ×1
http-caching ×1
ios ×1
nginx ×1
nsurlsession ×1
performance ×1
react-native ×1
ssl ×1
swift ×1