首页 > nginx相关 > 从apache迁移到nginx遇到的alias和rewrite问题

从apache迁移到nginx遇到的alias和rewrite问题

2009年1月14日 发表评论 阅读评论

这几天在把我们网站的主web server从apache迁移到nginx上面,没想到还是遇到了些问题。
1.原来在apache每个二级域名都是用建站点的方式,我打算在nginx里面使用rewrite规则的方式来进行跳转,比如:

1
2
3
4
location /
{
     rewrite ^(.*)life.my.com(.*)$ $1www.my.com/lan28/$2 last;
}

可事实上这样写是完全没有效果的,后来分析了下实际上在 location / 里面的rewrite是只能处理hostname之后的内容就是www.my.com/(rewrite),对于hostname是没法进行rewrite的,那如果要对hostname进行rewrite怎么办呢。目前想到是把rewrite挪到location外面去,不过尝试了下貌似还是有问题,继续研究中。。。

2.原来www下面有几个alias,比如访问/wwwroot/www/php/ alias 到/wwwroot/php/ 这样,但是在nginx里面alias的话呢htm、图片等静态文件没问题,但是php问题就来了,由于php是通过正则转发到fastcgi的比如:

1
2
3
4
5
6
7
8
9
10
11
root  /wwwroot/www;
location /php/
{
     alias /wwwroot/php/;
}
 location ~ .*\.php?$
{
     fastcgi_pass  127.0.0.1:9000;
     fastcgi_index index.php;
     include fcgi.conf;
}

这种情况下如果http访问/php/*.php文件实际上是由 location ~ .*\.php?$ 处理的,也就是说php文件根本没没有进行alias还是按照/wwwroot/www/php/的路径访问的。
这个问题如何解决呢,我想到了几个方法:
1)使用symbolic link从系统上把/wwwroot/php/映射到/wwwroot/www/php/
2)修改location ~ .*\.php?$ 的正则,将/php/目录排除,然后在写一个location ~ /php/.*\.php?$ 来处理/php/下面的php文件
3)放弃alias使用rewrite的方式来处理。
三个方法第一个属于回避型,虽然能解决问题但是不符合我的要求。第二个么太复杂,能否实现还是未知。最后我选择了第三个方法就是用rewrite来处理。
略微修改了下代码

1
2
3
4
5
6
7
8
9
10
11
12
root  /wwwroot/www;
location ^~ /php/ #这里的关键就是使用“^~”,这样如果是/php/的话就不去匹配下面的php的正则,而全部重定向到php.my.com去,不然的话还是一样的htm正常,php无法访问。
{
     rewrite (.*)/php/(.*) http://php.my.com/$2 permanent;
}
location ~ .*\.php?$
{
     fastcgi_pass  127.0.0.1:9000;
     fastcgi_index index.php;
     include fcgi.conf;
}
·

这里的http://php.my.com 对应的就是/wwwroot/www/php/
这样基本就实现了需求了





分类: nginx相关 标签: , ,
  1. 游客
    2009年8月22日09:52 | #1

    域名泛指nginx二级域名rewrite
    server {

    server_name ~^(.*)\.website\.cn$;
    set $name $1;
    rewrite ^ http://www.website.cn/$name$request_uri ;
    }

  1. 本文目前尚无任何 trackbacks 和 pingbacks.