现在的位置: 首页Nginx>正文
当ngx_cache_purge遇到大小写 [原创]
2011年11月24日 Nginx 当ngx_cache_purge遇到大小写 [原创]已关闭评论 ⁄ 被围观 12,336 次+

最近配置另外一套刚做的系统时遇到了些问题?采用nginx_cache缓存,使用ngx_cache_purge来清除缓存。由于之前的cms系统url全部是小写字母或数字,所以就没有这样的问题,现在的问题是url包含大小写字母,不管用户输入的是大小写字母都可以访问到指定内容,由于ngx_cache缓存是$host$uri$is_args$args做key进行md5后生成的缓存文件名,这样一来大写小写会各缓存一次,而清除缓存的时候是根据读取页面中的链接来清除缓存的,就会遇到某些缓存是清除不掉的。下面举几个例子。比如:
访问地址:http://www.dyx.com/go/XianXia和http://www.dyx.com/go/xianxia访问结果是一样的
清除缓存:http://www.dyx.com/purge/go/XianXia而http://www.dyx.com/purge/go/xianxia则清除不掉
我采用的方法是使用nginx的lua模块(参考:FreeBSD下nginx添加lua-nginx-module模块,使nginx支持lua强大的语法),用lua来把请求的url都给转换成小写,这样缓存下来的只有小写的,清除缓存也是一样,统一了大小写后,问题就解决了
nginx配置如下:

  1. location /   
  2. {   
  3.     content_by_lua 'local res = ngx.location.capture("/lua"..string.lower(ngx.var.uri))   
  4.     if res.status == 200 then   
  5.     ngx.print(res.body)   
  6.     end';   
  7. }   
  8.   
  9. location /lua   
  10. {   
  11.     rewrite ^/lua/$ /index.php?mod=index break;   
  12.     rewrite ^/lua/ssi_([a-zA-Z]+)_(\d+)_(latest|libao|yygs|all)$    /index.php?mod=ssi&action=$1&gameid=$2&by=$3break;   
  13.     rewrite ^/lua/(index|test)\.html$       /index.php?mod=$1 break;   
  14.     rewrite ^/lua/game/([a-zA-Z\d]+)/?$     /index.php?mod=game&action=game&english=$1break;   
  15.     rewrite ^/lua/game/([a-zA-Z\d]+)/([a-zA-Z]+)-list(?:_(?!0)(\d+))?\.html$        /index.php?mod=game&action=list&english=$1&type=$2&pageno=$3break;   
  16.     rewrite ^/lua/game/([a-zA-Z\d]+)/([a-zA-Z]+)-(\d+)(?:_(?!0\d|1\.)(\d+))?\.html$     /index.php?mod=game&action=content&english=$1&type=$2&id=$3&pageno=$4break;   
  17.     rewrite ^/lua/news/(\d+)(?:_(?!0\d|1\.)(\d+))?\.html$       /index.php?mod=public&action=news&id=$1&pageno=$2break;   
  18.   
  19.     proxy_set_header DIANHOST www.dyx.com;   
  20.     proxy_pass http://admin.dyx.com;   
  21.     proxy_cache cache_tmp;   
  22.     proxy_cache_valid 200 304 12h;   
  23.     proxy_cache_valid 301 302 1m;   
  24.     proxy_cache_key $host$uri$is_args$args;   
  25. }   
  26. #清除缓存   
  27. location ~* ^/purge/   
  28. {   
  29.     if ($uri ~ ^/purge/$)   
  30.     {   
  31.         set $cachekey /index.php?mod=index;   
  32.     }   
  33.     if ($uri ~ ^/purge/(index|test).html$)   
  34.     {   
  35.         set $cachekey /index.php?mod=$1;   
  36.     }   
  37.     if ($uri ~ ^/purge/game/([a-zA-Z\d]+)/?$)   
  38.     {   
  39.         set $cachekey /index.php?mod=game&action=game&english=$1;   
  40.     }   
  41.     if ($uri ~ ^/purge/game/([a-zA-Z\d]+)/([a-zA-Z]+)-list(?:_(?!0)(\d+))?\.html$)   
  42.     {   
  43.         set $cachekey /index.php?mod=game&action=list&english=$1&type=$2&pageno=$3;   
  44.     }   
  45.     if ($uri ~ ^/purge/game/([a-zA-Z\d]+)/([a-zA-Z]+)-(\d+)(?:_(?!0\d|1\.)(\d+))?\.html$)   
  46.     {   
  47.         set $cachekey /index.php?mod=game&action=content&english=$1&type=$2&id=$3&pageno=$4;   
  48.     }   
  49.     if ($uri ~ ^/purge/news/(\d+)(?:_(?!0\d|1\.)(\d+))?\.html$)   
  50.     {   
  51.         set $cachekey /index.php?mod=public&action=news&id=$1&pageno=$2;   
  52.     }   
  53.   
  54.     if ($uri ~ ^/purge/ssi_([a-zA-Z]+)_(\d+)_(latest|libao|yygs|all)$)   
  55.     {   
  56.         set $cachekey /index.php?mod=ssi&action=$1&gameid=$2&by=$3;   
  57.     }   
  58.   
  59.     if ($cachekey = "")   
  60.     {   
  61.         return 405;   
  62.     }   
  63.   
  64.     set_by_lua $cachekey 'return string.lower(ngx.var.cachekey)';   
  65.     proxy_cache_purge cache_tmp $host$cachekey;   
  66. }  

本文地址:http://www.92csz.com/48/994.html
如非注明则为本站原创文章,欢迎转载。转载请注明转载自:moon's blog
 

抱歉!评论已关闭.