Loading...

Tag Archive for 'multi-condition'

    AD: 猛买网,精彩团购 | Jobsdigg | 很棒的男装店 | 网站地图

在nginx中使用多个条件进行rewrite

买了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 $supercache_uri ”;
}
# Using pretty permalinks, so bypass the cache for any query string
if ($query_string) {
set [...]