最近有一个项目的重构,由于项目较大,将会采用迭代上线的方式。由于原项目极为陈旧,url和文件组织形式不太规范,故重构后会对此进行调整,但需要保持对原有url的兼容。新版本使用yaf框架,由于项目不需要作SEO,故使用其yaf_route_simple路由协议,即通过url中的module、controller、action参数进行路由解析。

具体路由过程包括以下3步:

  1. 将已重构页面的流量切换到新服务器上。
  2. 进行url的rewrite。
  3. 根据Yaf框架进行路由了。

如上图所示,第一步利用旧服务器上已有的分流器软件,将匹配某些url规则的请求转发到新服务器,完成host的映射(不至此url映射)。其实这里也可以利用apache的rewrite和load balance功能或者直接使用 mod_proxy_balancer模块,这样,甚至可以直接将第二步的url映射合并到这里,从而节省掉第二步。这里rewriterule的P flag意味着内部proxy,即apache充当代理的角色,请求配置的目标url,会触发mod_proxy模块。官方文档上给出了安全和性能方面的警告。个人感觉,稳定性和性能比较合适的还是nginx,其最初的应用场景大多是作为代理服务器,且具备url rewrite的功能。

RewriteEngine on
RewriteMap lb rnd:/path/to/serverlist.txt
RewriteRule ^/(.*) http://${lb:servers}/$1 [P,L]

Security Warning

Take care when constructing the target URL of the rule, considering the security impact from allowing the client influence over the set of URLs to which your server will act as a proxy. Ensure that the scheme and hostname part of the URL is either fixed, or does not allow the client undue influence.

Performance warning

Using this flag triggers the use of mod_proxy, without handling of persistent connections. This means the performance of your proxy will be better if you set it up with ProxyPass or ProxyPassMatch

This is because this flag triggers the use of the default worker, which does not handle connection pooling.

Avoid using this flag and prefer those directives, whenever you can.

第二步,在新服务器的apache配置中添加rewrite规则,完成url的映射(这里需要分析待映射url的规则,写出合适的正则句子即可):

RewriteEngine on
#RewriteRule (.*)_(.*)\.php $1$2.php
RewriteRule ^/([^/]+)/([-_a-zA-Z0-9]+)\.php /dispatch.php?yafc=$1&yafa=$2 [QSA,L]

最后控制权交到应用层,在Yaf框架中,需要将路由协议由默认的static更改为simple的。可以在Bootstrap.php中添加方法:

public function _initRoute(Yaf_Dispatcher $dispatcher) {
$route = new Yaf_Route_Simple(“yafm”, “yafc”, “yafa”);
$router = Yaf_Dispatcher::getInstance()->getRouter();
$router->addRoute(“name”, $route);
}

至此,即完成了整个url兼容过程,当然这里还可以更多的考虑到性能和安全问题,以及与具体项目的结合度。

 

 

Leave a Reply