February 9th, 2010 by 张磊
Web服务器大多是支持直接发送GZip文件的。本文算是Rails中使用压缩的静态缓存的姊妹篇,谈谈在nginx中,进行适当配置使nginx直接发送压缩文件到浏览器。 配置起来非常容易。大致如下(实际情况可能更为复杂): location / { set $gzip_suffix ‘.gz’; if (-f $request_filename$gzip_suffix) { add_header Content-Type ‘text/html’; add_header Content-Encoding gzip; gzip off; rewrite (.*) $1.html$gzip_suffix break; } } 在上面这段配置中,先判断是否有xxx.gz文件存在,若有,则进入相应分支。在这个分支中,使用了两个add_header,会在响应头信息中增加相应的字段,以使客户端了解这是经过压缩的内容。若没有Content-Type ‘text/html’,打开页面时浏览器会弹出一个下载提示;若没有Content-Encoding gzip,打开只能看到一堆乱码。下面的 gzip off 则告诉nginx,不必再对这部分内容做压缩。 这样,就可以使nginx支持直接发送GZip压缩后的内容了,而且在浏览器中打开和普通html没有任何区别。但这种配置方式还遗留了一个问题,就是任何gz文件都被作为text/html而发送了。也许有这种需要:请求xxx.xml就将Content-Type设置为text/xml;请求xxx.css就将Content-Type设置为text/css。这当然有办法满足,不过我把这问题留给诸位,可以参考下这篇老文:在nginx中使用多个条件进行rewrite,相信可以助你秒杀这种需求。 此外,推荐一下RackspaceCloud。如果手头没有linux而且不方便拿服务器上的nginx做实验,可以在RackspaceCloud新建个服务器玩儿,搞完删掉就好了,既方便又干净。
April 22nd, 2009 by 张磊
买了VPS以后,不甘只用apache。于是我换上了nginx做Web Server。但原来rewrite规则需要“翻译”成nginx的语法,这里就出了问题。我的blog使用着supercache,另一个网站使用了类似的静态缓存(请看我另一篇文章:8行代码实现supercache)。问题出在哪里呢?supercache的实现方式,是基于多组合条件的rewrite,但nginx恰恰不支持嵌套的或并列的 if 判断语句,于是没法直接支持多条件的rewrite。 比如,在apache中使用supercache时一段配置是这么写的: RewriteCond %{REQUEST_METHOD} !=POST RewriteCond %{QUERY_STRING} !.*s=.* RewriteCond %{QUERY_STRING} !.*p=.* …… RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html.gz [L] 可以看到,apache在经过一大堆RewriteCond的判断后,才进行rewrite。但在nginx中,无法这么写: if ($request_method !~ ^post$ && $request_filename !~ .*s=.* …) { rewrite … } 一时没想到好办法,直到找到一篇文章: nginx rewrite rules for WordPress + WP Super Cache,豁然开朗:虽然没有嵌套的if,但是可以用set语句为一个变量赋值,这样,就可以设置一个变量作为标志位。看看在这种思路指导下的配置: set $supercache_file ”; set $supercache_uri $request_uri; if ($request_method = POST) { set [...]
July 16th, 2006 by 张磊
以前在看大众点评的时候,对他们做的静态化页面百思不得其解。后来问馒头,馒头说可能是服务器设置的问题。反正当时候自己想不明白,只能想到一个折衷的办法,类似于我用的exblog的url伪装功能。 今天看livid又发布了一个新版本的babel。每次的安装说明他都会强调apache 的 url rewrite ,一直不知道是个啥东西。直到上午闲的无聊找zend for linux下中文显示的解决办法,却 看到了一篇和url rewrite有关的文章。 Quote: 1、对于有服务器配置权限的用户,推荐使用Apache的mod_rewrite模块,这里假设已经安装好mod_rewrite模块。打开Apache的配置文件,找到相应主机的部分,添加以下代码: Code: RewriteEngine On RewriteRule ^/abc/([a-z]+)/([0-9]+).html$ /abc.php?action=$1&id=$2 [L] 然后在shell里执行service httpd reload,让Apache重新载入配置就好了。现在在PHP页面里面我们可以把链接写成abc/a/1.html的形式,Apache在解析这个 URL的时候会rewrite成abc.php?action=a&id=1的形式,并返回正确的页面。运用正则表达式我们可以实现几乎任何我们想要的链接形式,mod_rewrite模块的功能异常强大,这里只是一个及其简单的应用。 2、对于租用空间的用户,一般都没有办法修改Apache的配置,这里有个变通的方法,原理是这样的:当要传递参数访问PHP页面时,正常情况下是通过自动全局变量$_GET来获得,比如上面的链接,在页面里可以通过$_GET['action'] 和 $_GET['id']来获得,重写URL后就不行了。现在在每个页面里require一个url_rewrite.php文件,里面代码如下: Code: $filename = basename($_SERVER['SCRIPT_NAME']);if (strtolower($filename) == “abc.php”) { if (!empty($_GET[id])) { $id = intval($_GET[id]); $action = intval($_GET[action]); } else { $nav = $_SERVER["REQUEST_URI"]; $script = $_SERVER["SCRIPT_NAME"]; $nav = ereg_replace(“^$script”, [...]