我目前正在Azure Blob存储中存储文件,当我请求文件时,我在304的firebug中收到消息"使用HTTP条件头指定的条件不符合"
我看过Azure Blob:"使用HTTP条件头指定的条件不符合",这是一个类似的问题,但我不是在阅读使用blob.openread等的内容...我只是在尝试在浏览器中查看内容.
如果我在firefox中进行控制刷新(ctrl和f5),我得到200的响应 - 所以它正确地提供了.我已经在我正在返回的文件上设置了缓存控制(max-age = 3600,public),但我仍然收到此错误/通知.
我的问题是,当我要求内容回复此回复时,我是否应该担心?
您将获得任何建议/想法
谢谢Steve
Code Igniter版本'2.0.3'Jquery 1.7 Jquery History插件
嗨,大家好,
我有一个CodeIgniter应用程序,我以ajax方式构建.我有如下功能:
$(document).on('click','.ajax_link',function(e){
//Stop the normal href action
e.preventDefault();
//Grab the destination URL
var new_url = $(this).attr('href')
//Grab the content via ajax and pass it to the history change function
$.get(base_url+new_url,function(data){
History.pushState({
content:data.content,
url:data.url
}, data.title, data.url);
//Refresh some site variables
refresh();
},'json');
});
Run Code Online (Sandbox Code Playgroud)
它只是通过一个ajax_link类捕获对锚元素的点击,并将响应发送到一个处理该响应数据放入页面的函数.
这适用于Chrome和FF.我点击链接,jQuery发出get请求,我得到一个JSON对象,我的history.pushState()函数将一些json数据注入我的页面.
我遇到的问题是在IE8中.基本上发生的事情是当我第一次打开应用程序时,链接可以工作,但它们只能工作一次.我第二次点击链接:
GETjQuery.get()回调函数,因此停止死机.如果我清除缓存它再次工作.所以我的假设是IE正在执行get请求,但后来它发现它已经在过去请求了完全相同的文件...因此完全停止了该过程.
有人知道解决这个问题吗?我已经看过在IE中提到304错误和ajax和缓存的错误但是还没有找到与我相同的问题.
任何帮助非常感谢
(在Windows虚拟机IE8和Internet Explorer 9中的IE 8模式上测试)
解决了
只需要将以下代码添加到我的document.ready函数中,问题就消失了.
$.ajaxSetup ({cache: false});
Run Code Online (Sandbox Code Playgroud) ajax jquery caching internet-explorer-8 http-status-code-304
我目前正在尝试了解304/Not修改的确切条件是否符合3xx范围的HTTP状态代码类.RFC 1945,秒.9.3和RFC 2616,sec.10.3都阅读:
此类状态代码指示用户代理需要采取进一步操作才能完成请求.
虽然"从客户端的本地缓存加载"显然是"进一步的行动",但我很难看到这是HTTP的意义上的重定向.我在字面上读这个吗?
当用户请求相同的页面时,使用相同的数据......我希望Django返回304,这样浏览器就不必重新加载页面了.
我是新手.如何才能做到这一点?
谢谢.
使用ServiceStack,我只想返回304 Not Modified:
HTTP/1.1 304 Not Modified
Run Code Online (Sandbox Code Playgroud)
但ServiceStack添加了许多其他不需要的(返回带有304代码的HttpResult)标头:
HTTP/1.1 304 Not Modified
Content-Length: 0
Content-Type: application/json
Server: Microsoft-HTTPAPI/2.0
X-Powered-By: ServiceStack/3.94 Win32NT/.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Content-Type
Date: Tue, 07 Aug 2012 13:39:19 GMT
Run Code Online (Sandbox Code Playgroud)
如何防止输出其他标题?我已经尝试了HttpResult的各种方法,注册了一个虚拟内容类型过滤器,但是它的名字仅暗示控件内容,而不是标题或此处列出的其他内容.我也尝试使用IStreamWriter和IHasOptions实现我自己的IHttpResult派生,结果相同:ServiceStack添加了不需要的标头.
谢谢
更新
能够去除content-type通过使用以下,但有些头依然存在,即content-length,server和date.
public override object OnGet(FaultTypes request)
{
var result = new HttpResult
{
StatusCode = HttpStatusCode.NotModified,
StatusDescription = "Not Modified", // Otherwise NotModified written!
}; …Run Code Online (Sandbox Code Playgroud) 我正在构建一个node.js应用程序 - 每天一次 - 从一些外部Web服务器(使用" 请求 "包)获取数据.
我想避免两次获取相同的数据,所以我在第一次下载(200状态代码)时跟踪每个资源ETag .
然后,当再次(第二天)获取该资源时,我If-None-Match在请求中添加了带有已保存的etag 的标头.
因为我怀疑有时候从远程Web服务器接收200状态代码(而不是预期304),即使资源内容没有被修改,我问我是否应该期望ETag在304响应中返回资源(以及如何在request响应...),尝试调试此问题.
我构建了一个服务工作者,它总是用来自缓存的数据进行响应,然后在后台向服务器发送请求。如果服务器响应HTTP 304 - not modified一切正常,如果服务器响应HTTP 200,则意味着数据已更改并将新文件放入缓存中,同时通知用户并要求刷新页面。
我使用not-modified-since/last-modified标头来确保客户端获得最新版本。当通过请求发送fetch()请求时,它会在其通往网络的路上传递 HTTP 缓存 - 响应到达客户端时也会传递 HTTP 缓存。问题是当响应具有状态时304- 未修改 HTTP 缓存使用缓存版本响应服务工作者并将状态替换为200(如获取规范中所述 - HTTP-network-or-cache-fetch)。在 Service Worker 中,无法确定200响应最初是由服务器发送的(用户需要更新)还是由缓存发送并且服务器最初响应为304 (已经加载了最新版本)。
有可以设置为的缓存模式标志no-cache,但是当请求发送到服务器时,这也会绕过 HTTP 缓存,这意味着if-modified-since未设置标头并且服务器没有机会找出哪个版本客户有。此外,此标志目前仅由 Firefox 每晚支持。
我认为最好的解决方案是设置一个自定义的 HTTP 标头,就像x-was-modified服务器以200. 可以在 service worker 中访问此自定义标头,并可用于确定资源是否已更新 - 即使 HTTP 缓存将304状态替换为200.
x-if-modified-since …caching http http-caching http-status-code-304 service-worker
鉴于我有 Rails 控制器,它访问数据库以检索数据并使用序列化程序呈现 JSON 响应,必须满足什么条件才能使 rails 以 304 响应?
如果它必须将先前的响应与当前检索到的响应进行比较,它是哪种比较?
可能是一个愚蠢的问题,但我还没有找到任何明确的答案.
我的服务器处理ETag缓存以获得我们所拥有的一些非常大的JSON响应,304 NOT MODIFIED如果If-None-Match标头包含与新生成的相同的散列(浅ETag),则返回空主体.
浏览器是否应该自动处理,或者异步使用API的浏览器内客户端应用需要实现一些逻辑来处理这样的响应(即如果304响应则使用缓存版本,否则创建/更新缓存版本)?
因为到目前为止,我已经手动实现了这个逻辑客户端,但我想知道我是否只是重新设计了方形轮...
换句话说,Cache-Control例如,使用标题,浏览器内的客户端应用程序不需要解析值,max-age例如检查,以某种方式存储它,设置超时等等:所有内容都由浏览器直接处理.问题是:浏览器在收到浏览器时应该采用相同的方式304吗?
以下是我到目前为止编写客户端的方法(使用AngularJS构建,在浏览器中运行):
myModule
.factory("MyRepository", ($http) => {
return {
fetch: (etag) => {
return $http.get(
"/api/endpoint",
etag ? { headers: { "If-None-Match": etag } } : undefined
);
}
};
})
.factory("MyService", (MyRepository, $q) => {
let latestEtag = null;
let latestVersion = null;
return {
fetch: () => {
return MyRepository
.fetch(latestEtag)
.then((response) => {
latestEtag = response.headers("ETag");
latestVersion = response.data; …Run Code Online (Sandbox Code Playgroud) 我有一个网站,其中包含不会更改的静态资产(js、图像等)。这些资源中的每一个都具有带有以下属性的缓存控制标头集:
cache-control: public, max-age=31536000, immutable
Run Code Online (Sandbox Code Playgroud)
但是,当我重新加载页面时,我仍然看到来自服务器的 200 响应,而不是 304 响应。浏览器指示正在从内存或磁盘缓存提供资源,但它仍在发出请求并下载内容。这以前是有效的,我倾向于这是一个浏览器错误,但我不完全确定。
http cache-control http-status-code-304 http-status-code-200
http ×5
caching ×3
ajax ×1
azure ×1
blob ×1
browser ×1
django ×1
etag ×1
header ×1
http-caching ×1
http-headers ×1
jquery ×1
python ×1
servicestack ×1