2009年3月31日星期二

nginx基于域名的rewrite实现

工作中需要将一台server从lighttpd环境迁移到nginx上.
遇到一个问题,原来lighttpd.conf配置中:

$HTTP["host"] =~ "^([^.]+)\.test\.com" {
server.document-root = "/docroot"
url.rewrite = ( "^/$" => "/index.php?username=%1")
}

访问 http://abc.test.com/ rewrite 到 http://abc.test.com/index.php?username=abc

nginx 配置没有lighttpd灵活,rewrite 只能对url中path部分操作.

查看nginx 文档 发现,新版本已经内置了变量可以直接读取host了
设置如下:

http {
servername *.test.com;
...

if ($http_host ~* "^(.+)\.test\.com") {
set $user $1;
rewrite ^/$ /index.php?username=$user last;
}

...
}

搞定,收工!

后话: 根据文档 $host 和 $http_host 应该是等价的,但是开始的时候我用$host不成功,不知道为什么,没时间研究下去了,有人看看源码告诉我结果吧,嘿嘿.

没有评论: