Tag: http

squid在max-age=0的情况下强制回源的问题

现在我们反向代理服务器准备用squid,起初设想的逻辑是这个样子的:让squid缓存源站的内容,如果源站的内容更新之后,手动调用一下脚本更新一下squid上的缓存,也就是执行类似这样一个命令:squidclient -h $squidIp -p $squidPort -m PURGE $http_url_to_refresh_cache。但是发现当源站返回的响应头中包含cache-control:max-age=0问题就来了,squid对于这种请求,在刷新浏览器之后强制回源了,我们本想让浏览器和squid之间进行通信,不要进行回源,但是现在却事与愿违了。本来我们是设想只在调用命令手动刷新之后,squid才(在下次重新请求时)去回源,现在倒好每次都回源了。 然后在说回来我们为什么使用max-age=0,因为如果我们不使用这个设置的话,浏览器就很有可能在下次请求的时候使用本地缓存文件,而不和squid服务器之间进行通信,这样即使我调用了PURGE命令,浏览器依然有可能使用的是就文件。 最后说一下今天查询的关于squid的配置资料,大体上发现有配置项ignore-no-cache可以忽略cache-control:no-cache,配置项override-expire可以忽略expire:xxx,但是没有发现哪个配置项可以忽略max-age=0的这种情况。 最后说一下,为啥不采用每次更新文件都改名的方式,如果每次更新文件都改名,那么就可以将所有文件都设置一个很大的max-age值,那么就不会遇到max-age=0被强制回源的问题了。答案是之前我们用第三方的解决方案的时候,一直都是用同名文件刷新缓存的方式,当然也有更改文件路径的情况,但是那些一般用在批处理操作中,刷新同名文件一般用在js文件中。 后来找到一个解决方案,把cache-control:max-age=0改为cache-control:no-cache,然后在squid配置ignore-reload,具体配置语法参见squid官网refresh_pattern的说明文档:http://www.squid-cache.org/Doc/config/refresh_pattern/。配置完成之后确实起作用了,但是最近发现这个解决方案也莫名其妙的失效了,squid的配置文件在这当中没有被修改过,squid也没有做升级,然后就不行了,这都已经黔驴技穷了,不知道该如何是好。

HTTP响应中Cache-Control: max-age设置的缓存,什么时候会在浏览器关掉后失效?

清除缓存后,用IE 8访问百度首页,百度logo图片的请求和返回结果如下: GET /img/bdlogo.gif HTTP/1.1 HTTP/1.1 200 OK Date: Wed, 05 Jun 2013 13:21:17 GMT Server: Apache Last-Modified: Fri, 22 Feb 2013 03:45:02 GMT ETag: “627-4d648041f6b80” Accept-Ranges: bytes Content-Length: 1575 Cache-Control: max-age=315360000 Expires: Sat, 03 Jun 2023 13:21:17 GMT HTTP返回的header中,最后两行表示,缓存设置的有效期是3650天 在我家里面的电脑上测试时,如果马上关掉浏览器重新打开百度首页,这个图片会直接从浏览器的缓存中读取,和我的理解一致。 但奇怪的是在公司的电脑上,按照同样的步骤、浏览器测试,第二次访问的时候浏览器并没有读取本地缓存,而是重新向服务器发出了请求,服务器返回304状态代码。 可能是什么原因造成了两次测试结果的不一致?

浏览器是否会缓存html页面

2016-06-24 更新: 前端开发时,通常说到静态资源,都只提及css和js,清理缓存时也只是针对css和js,没有看过 “清除html缓存” 的说法(可能是我孤陋寡闻0_0)。为什么呢?HTML不会被缓存吗? ——————————分割线—————————————— 以下是原提问: 对于前端开发,在开发过程中我们要及时看到修改后的效果,清除缓存针对的都是 css 、js 静态资源文件。 那么html文件呢?在访问之后是否会被缓存?为什么? 如用 <a> 标签访问: <a href=”http://b.com/index.html”>goto B</a> 我自己简单地测试了一下: 本地服务器配置两个项目:A和B 项目A很简单,只有一个html文件,只有一个标签,如下: <a href=”http://b.com/index.html”>goto B</a> 项目B根目录下有 index.html ,在里面写一个标签作为标记: <h1>1</h1> 结果:每次改变index.html 里 <h1> 的数字,通过<a href=””>跳转都会及时更新。 疑问:为什么css、js静态资源会被缓存,而html不会被缓存呢? 我想解决的实际问题是这样的:我有两个项目,项目A在一个html页面的 <a href=””> 标签中访问了项目B的html页面。我想知道,当我修改了B中的html页面内容,用户再通过A的 &lta> 标签访问时,是会及时更新还是用户的浏览器会读取缓存的html内容?对于自己的测试并不放心,因为遇到过不会及时更新的情况,但是不知道为什么无法重现这种情况。-_-b

掌握 HTTP 缓存——从请求到响应过程的一切(上)

掌握 HTTP 缓存——从请求到响应过程的一切(上) CDN类的网站曾经一度雄踞 Alexa 域名排行的前 100。以前一些小网站不需要使用 CDN 或者根本负担不起其价格,不过这一现象近几年发生了很大的变化,CDN 市场上出现了很多按次付费,非公司性的提供商,这使得 CDN 变成人人都能负担的起的一种服务了。本文讲述的就是如何使用这种简单易用的缓存服务。 使用内容分发网络( CDN )你需要先正确地认识 HTTP 响应头:和 HTTP 响应头中的哪些标签相关?它们是怎么起作用的?如何使用它们?文章中我会回答这些问题。 本文讲的并不会像教科书那么精确,实际上在某些情况下,为了叙述的清晰、简洁,我会按自己的理解简化某些问题,文章中会通过一些实际的例子来介绍缓存理论。在这篇文章的基础上,还会写一些文章来介绍对于某些指定的 CMS 或框架如何使用 CDN 来作为缓存层。 为什么使用 CDN? CDN 是一个全球分布式网络,它把网站内容更快地传递给全球范围内的一个具体位置,而往往这个具体的位置离实际的内容服务器距离很远。举个例子,你的网站主机在爱尔兰,而你的用户则在澳大利亚访问。这时当你的用户访问你的网站的时候,延迟会很大,把你的(静态)数据用 CDN 放到澳大利亚则会很大程度上提高用户访问网站的体验。 然而 CDN 的使用并不局限于此。其实 CDN 可以理解成一个普通缓存,如代理缓存(边缘缓存)。即便你并不关心用户的具体地理位置,你也应该考虑使用 CDN 的代理缓存来提高你的用户体验。 为什么使用代理缓存? 简而言之,代理缓存会缓存你网站一些页面,通过缓存来传输“静态”内容非常快。一个简单的例子,假设你有一个带有开始页面的博客,这里面列出了所有近期的博客列表。完成这一过程,PHP 脚本要从数据库中获取到最近的文章实体,并且将它们转换成 HTML 结果页并返回给用户。因此,对于一次请求(访问)包含了:一次 PHP 执行 + 一组数据库查询。对于 1000 次请求(访问)包含了:1000 次 PHP 执行 + 1000 组数据库查询。每一次 PHP […]

关于HTTP的Cache的问题

会在200OK中回送该资源的Last-Modified和ETag头,客户端将该资源保存在cache中,并记录这两个属性。当客户端需要发送相同的请求时,会在请求中携带If-Modified-Since和If-None-Match两个头。 HTTP不是无状态的么?前一次Last-Modified和ETag参数如何记录的?再次发送同样的请求的时候,浏览器是在哪里获取的这两个参数?cookie中么?还是本地一些缓存文件中? 还请各位大神解答~

查找本机的http服务对应的本机目录

本机(linux)上某软件(rygel)打开后会提供http服务,然后可以通过http://10.4.47.249:56087/b815c168-1aa5-4da1-93a7-6a43494ac6dd.xml在浏览器中打开xml文件(10.4.47.249是本机的IP) 现在我想知道这个软件把哪个目录做成的http服务的目录(表达可能不太清楚,意思就是上面的xml文件在本机的哪个目录下),有没有什么工具/方法能够做到 PS: 我用find找这个xml文件了,没有找到而且不知道大概在哪个目录下所以是在/中find的,很费时间 问题的题目表述的也不太好,抱歉

80端口转发的问题

用DDNS解析域名http://hustlibraco.vicp.cc/到家里的公网ip,然后设置家里的路由器进行端口转发 ,把8888端口的数据转发到家里的一台linux虚拟机上的8888端口,linux服务器在8888上监听请求。 然后就可以采用http://hustlibraco.vicp.cc:8888访问到linux服务器。 但是访问linux的时候老是带个端口号很麻烦,http默认端口是80,尝试更改路由器设置把80端口转发到linux的8888端口,使用http://hustlibraco.vicp.cc访问linux,结果显示无法连接。这是什么问题呢,怎么样去掉端口号访问到我的linux虚拟机? 补充:服务器上运行服务的代码 #!/usr/bin/env python import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write(‘hello,world!’) application = tornado.web.Application([ (r’/’, MainHandler), ]) if __name__ == ‘__main__’: application.listen(8888) tornado.ioloop.IOLoop.instance().start()

关于HTTP消息头中Connection是Keep-Alive的一个问题

问一个应该是很基础的问题 在我调查的代码中,HttpServer是按照如下方法实现的: 1.用socket()产生socket fd(1),用bind()将socket fd(1)与指定IP:port绑定后,用listen()监听此socket fd(1)。 2.用FD_SET()将sokcet fd(1)加入fdset,用select()监听此fd是否被修改。select()返回后调用accept(),accept()的返回值表示新建立的连接的socket fd(2),然后在新线程中用recv()接收此socket中的数据。 3.第2步循环执行 我有一个不明白的地方: 如果client A向server发送的第一个消息头中Connection是Keep-Alive,那么接收到client A的第二条消息是不是对socket fd(1)没有影响,也就是说select()应该继续阻塞,直到新的client请求建立连接。

http协议里面的CRLF问题?

windows的换行符是 \r\n 然而linux unix mac os的换行符是\n s.send(b’GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n’) 那么上面这段代码 在Linux下改为: s.send(b’GET / HTTP/1.1 Host: www.sina.com.cn Connection: close ‘) 这样会不会报错呢? windows下会不会正常工作呢? 就是把CRLF换成字符串的形式(按一下回车键)这样可以吗?

http rest api 文档签名部分有误

见 http://docs.upyun.com/api/http_api/#UPYUN签名认证 文档声称 URI 请求路径,必须符合 http 协议标准:包含中文名称或特殊字符的文件名(或目录),需进行 urlencode 处理 但实际上这里的 uri 要求的仅仅是真正 uri 的 path 部分。 这个是 uri: http://v0.api.upyun.com/lyman-foo/hello/ 这个是 path: /lyman-foo/hello/