用proxy_intercept_errors和recursive_error_pages代理多次302

302是HTTP协议中的一个经常被使用状态码,是多种重定向方式的一种,其语义经常被解释为“Moved Temporarily”。这里顺带提一下,现实中用到的302多为误用(与303,307混用),在HTTP/1.1中,它的语义为“Found”.

302有时候很明显,有时候又比较隐蔽。最简单的情况,是当我们在浏览器中输入一个网址A,然后浏览器地址栏会自动跳到B,进而打开一个网页,这种情况就很可能是302。

比较隐蔽的情况经常发生在嵌入到网页的播放器中。例如,当你打开一个优酷视频播放页面时,抓包观察一下就会经常发现302的影子。但由于这些url并不是直接在浏览器中打开的,所以在浏览器的地址栏看不到变化,当然,如果将这些具体的url特意挑出来复制到浏览器地址栏里,还是可以观察到的。

上一段提到了优酷。其实现在多数在线视频网站都会用到302,原因很简单,视频网站流量一般较大,都会用到CDN,区别只在于是用自建CDN还是商业CDN。而由于302的重定向语义(再重复一遍,302的语义广泛的被误用,在使用302的时候,我们很可能应该使用303或307,但后面都不再纠结这一点),可以与CDN中的调度很好的结合起来。

- 阅读剩余部分 -

读《当我谈跑步时我谈些什么》有感

从来都不会想到,村上会是一个生活极其规律,几十年如一日坚持跑步训练,长期参与世界各地的马拉松比赛,甚至是铁人三项比赛的人。

在看完这本书并了解到这一点后,我又很难想象这样一个人居然是《挪威的森林》的作者。

其实,村上在书中某一章详细的回忆了当初是如何开始跑步的。他跑步的初衷不能说不简单,就是保持身体健康,以能写出更多更好的小说来:

打算作为小说家度过今后漫长的人生,就必须找到一个既能维持体力,又可将体重保持得恰到好处的方法。

是的,这就是他跑步几十年最原始的动力。娓娓道来,平淡如水。

- 阅读剩余部分 -

重新开始跑步

大三那年,跑了整整一年步,风雨无阻。五年后,我再度下了这个决心。

巧得很,正当我下完决心后,发现自己手里捧着一本村上春树的《当我谈跑步时我谈些什么》。当然这只是一种主观的说法,到底是在看这本书书的时候下了决心还是在看书之前已经下了决心,我自己也搞不清了。

跑步其实不仅仅是跑步这项运动。跑步意味着生活的一切都开始逐渐规律化,平静化,意味着对自己的掌控。

希望这是一个新的开始。

用git做本地备份

得益于强大的git以及github、bitbucket之类的外围产品,我们可以很方便的将自己本地的文件推到远端,除了可以完成它原本程序员之间协同工作的功能外,还可以单纯的将git作为本地备份工具来使用。

假设A目录是你的工作目录,这里面的文件经常变动,所以你想使用git来管理,但又不想推到远端,只想在本地保存。最简单的做法就是在工作目录下执行git init,git add, git commit等一系列操作。但这里有一个小问题,假如该目录是一个公用目录或其他原因,导致该目录有可能被直接删除掉,这样即使是git也无力回天了。

进一步想一下,这里有两种做法:

  1. 在另外一个目录B下做一个该工作目录的克隆,每次工作目录提交后,在B下面执行git pull来同步。这样比较麻烦的一点是每次都要切换目录pull。

  2. 在另外一个目录下新建一个裸仓库。执行git init --bare, 然后在A目录下将这个新建的裸仓库添加到上游upstream。这样每次在工作目录A下commit后,再执行一个push就可以了。

参考:

  1. http://treeleafmedia.be/blog/2011/03/creating-a-new-git-repository-on-a-local-file-system/

ngx.var.arg与ngx.req.get_uri_args的区别

ngx.var.arg_xx与ngx.req.get_uri_args["xx"]两者都是为了获取请求uri中的参数,例如

http://pureage.info?strider=1

为了获取输入参数strider,以下两种方法都可以:

  1. local strider = ngx.var.arg_strider

  2. local strider = ngx.req.get_uri_args["strider"]

差别在于,当请求uri中有多个同名参数时,ngx.var.arg_xx的做法是取第一个出现的值,ngx.req_get_uri_args["xx"]的做法是返回一个table,该table里存放了该参数的所有值,例如,当请求uri为:

http://pureage.info?strider=1&strider=2&strider=3&strider=4

时,ngx.var.arg_strider的值为"1",而ngx.req.get_uri_args["strider"]的值为table ["1", "2", "3", "4"]。因此,ngx.req.get_uri_args属于ngx.var.arg_的增强。

- 阅读剩余部分 -