如何生成"304 Not Modified"?
浏览器如何确定对http请求的响应是否为304?
是由浏览器设置还是从服务器发送?
如果由服务器发送,服务器如何知道缓存中可用的数据,它如何将304设置为图像?
我的猜测,如果由浏览器生成
function is_modified()
{
return get_data_from_cache() === get_data_from_url();
};
function get_data_from_cache()
{
return some_hash_or_xxx_function(cache_data);
}
function get_data_from_url()
{
return some_hash_or_xxx_function(new_data);
}
function some_hash_or_xxx_function(data)
{
// do something with data
// what is that algorithm.?
return result;
}
console.log(is_modified());
Run Code Online (Sandbox Code Playgroud)
我依靠第三方API提供程序来获取数据,解析并将其推送到数据库.在每个请求期间数据可能会也可能不会发生变化,但是标题总是发送200,我不想解析,检查DB中的最后一个唯一ID等等来确定数据的变化,也不直接比较结果而是我md5(),sha1()&crc32()HASHed结果和工作正常,但想知道算法来确定304.
我想使用相同类型的算法来确定数据的变化.
当我重新加载使用express制作的网站时,我得到一个使用Safari(而不是Chrome)的空白页面,因为NodeJS服务器向我发送了304状态代码.
怎么解决这个?
当然,这也可能只是Safari的问题,但实际上它适用于所有其他网站,所以它也必须是我的NodeJS服务器上的问题.
要生成页面,我正在使用Jade res.render.
更新:似乎发生此问题是因为Safari发送'cache-control': 'max-age=0'重新加载.
更新2:我现在有一个解决方法,但有更好的解决方案吗?解决方法:
app.get('/:language(' + content.languageSelector + ')/:page', function (req, res)
{
// Disable caching for content files
res.header("Cache-Control", "no-cache, no-store, must-revalidate");
res.header("Pragma", "no-cache");
res.header("Expires", 0);
// rendering stuff here…
}
Run Code Online (Sandbox Code Playgroud)
更新3: 所以完整的代码部分目前是:
app.get('/:language(' + content.languageSelector + ')/:page', pageHandle);
function pageHandle (req, res)
{
var language = req.params.language;
var thisPage = content.getPage(req.params.page, language);
if (thisPage)
{
// Disable caching for content files
res.header("Cache-Control", "no-cache, no-store, must-revalidate");
res.header("Pragma", "no-cache");
res.header("Expires", 0); …Run Code Online (Sandbox Code Playgroud) 如何检查jQuery.ajax()请求标头状态是否为"304 Not Modified"?
jqXHR.status通常返回200,即使请求的标题是"304 Not Modified".
ifModified:true 没有太多帮助,因为它破坏了XHR数据请求.
我尝试使用HttpWebRequest访问某些链接的任何想法我得到"远程服务器返回错误:(304)未修改." 在代码中?
我正在使用的代码来自Jeff的帖子(该页面似乎已经消失,请在Wayback Machine上查看归档副本).
注意代码的概念是一个简单的代理服务器,因此我将浏览器指向这个本地运行的代码片段,它获取我的浏览器请求,然后通过创建新的HttpWebRequest代理它,如您所见代码.它适用于大多数网站/链接,但对于一些人来说,这个错误出现了.您将在代码中看到一个关键位,它似乎将http标头设置从浏览器请求复制到它的请求到网站,并在标头属性中复制.不确定问题是否与它如何模仿请求的这个方面有关,然后结果会发生什么?
case "If-Modified-Since":
request.IfModifiedSince = DateTime.Parse(listenerContext.Request.Headers[key]);
break;
Run Code Online (Sandbox Code Playgroud)
我从例如http://en.wikipedia.org/wiki/Main_Page获得了该问题
PS.更新在这里
仍然无法解决这个问题.基本上我可以识别1个有问题的链接,它似乎工作正常,第二次得到错误,第3次OK,第4次得到错误,第5次OK等等好像有一些状态没有被清除或代码中有些东西.我尝试使用"使用"类型语句等来清理代码.
这是代码.如果有人能够发现为什么我每次第二次浏览http://newsimg.bbc.co.uk/css/screen/1_0_16/nol/v4/story.css这样的链接(从第2次开始,而不是第一次)通过这个代理代码,我得到了我想听到的错误.
class Program
{
static void Main(string[] args)
{
Proxy p = new Proxy(8080);
Thread proxythread = new Thread(new ThreadStart(p.Start));
proxythread.Start();
Console.WriteLine("Proxy Started. Press Any Key To Stop...");
Console.ReadKey();
p.Stop();
}
}
public class Proxy
{
private HttpListener _listener;
private int _port;
public Proxy(int port)
{
int defaultport = 8080;
// Setup Thread Pool
System.Threading.ThreadPool.SetMaxThreads(50, 1000); …Run Code Online (Sandbox Code Playgroud) 当Web服务器HttpWebRequest.GetResponse()使用HTTP 304(未修改)进行响应时,GetResponse()发生了a WebException,这对我来说非常奇怪.这是设计还是我错过了一些明显的东西?
这真让我挠头.也就是因为它只发生在IE浏览器中,而不是Firefox中,而且我认为jQuery实际上是浏览器中立的.在过去的几个小时里,我一直在抨击这件事情,至少已经确定了发生的事情.
这个jqGrid:
$("#DocumentListByPartRecordsGrid").jqGrid(
{
datatype: 'local',
colNames: ['<b>Id</b>', '<b>Document Name</b>', '<b>Document Type</b>', '<b>Effective Date</b>', '<b>Expiration Date</b>', '<b>Delete</b>'],
colModel: [
{ name: 'ASSOCIATION_ID', Index: 'ASSOCIATION_ID', resizable: true, align: 'left', hidden: true, sortable: false },
{ name: 'FILE_NAME', Index: 'FILE_NAME', resizable: true, align: 'left', sortable: false, width:'20%' },
{ name: 'DOCUMENT_TYPE', Index: 'DOCUMENT_TYPE', resizable: true, align: 'left', sortable: false, width:'20%' },
{ name: 'EFFECTIVE_DATE', Index: 'EFFECTIVE_DATE', resizable: true, align: 'left', sortable: false, width:'20%' },
{ name: 'EXPIRATION_DATE', Index: 'EXPIRATION_DATE', resizable: true, align: …Run Code Online (Sandbox Code Playgroud) 我试图了解"状态304未修改"和"200(来自缓存)"之间究竟有什么区别

我在最后更改的javascript文件上获得304.为什么会这样?谢谢你的帮助.
情况:运行Google App Engine站点,我的静态内容的default_expiration设置为"14d"
问题:在Chrome和Safari中,访问URL(不重新加载,只是将光标放在地址栏中并按Enter)会导致大量请求被If-None-Match标头触发.正如预期的那样,响应总是304 Not Modified.我可以看到这些请求在Charles或Fiddler等调试代理中被触发.
想要:完全避免这些请求和完全针对静态内容的304响应 - 只需信任浏览器缓存的内容即可.
我们使用标准的"缓存静态内容很长一段时间,当我们需要破坏缓存"系统时,我们将负责对我们的查询字符串进行附加?version = {version}修改,所以我们真的很想避免304的.
信念:我认为这是由app引擎随每个静态内容响应发送的etag标头引起的.在App Engine SDK并没有下来发送这个头,并与SDK乱搞的时候我没有看到这个304的行为.
有什么建议?你可以关闭app引擎静态内容的etags吗?
更新了静态内容的示例: http ://www.khanacademy.org/stylesheets/shared-package/compressed.css
google-app-engine caching webkit google-chrome http-status-code-304
我找不到任何问题的答案,可能是我错过了什么......
当我要求提供网址时,我需要知道响应是来自缓存还是来自网络.
状态代码是304还是200?(但AFNetworking总是回应200)
随着ASIHTTPRequest我用来检查" didUseCachedResponse"从ASIHTTPRequest,这是完美的.
ASP.NET MVC 3.0,IIS 7,.NET 4
我有一个动作,返回很少变化的数据(几乎是静态的).
有一个简单的方法:
我return Content('my data');用于行动结果.
基本上我想要一个简单的方法来完成本文中所讨论的内容:http://weblogs.asp.net/jeff/archive/2009/07/01/304-your-images-from-a-database.aspx