浏览 2528 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-03-26
最近在配置zend的路由,需要根据不同的二级域名进行权限控制。其中使用到了Zend_Controller_Router_Route_Hostname这个路由。并使用了路由链,配置代码如下: routes.hostname.type = "Zend_Controller_Router_Route_Hostname" routes.hostname.route = ":instance" routes.hostname.chains.static.route = ":action" routes.hostname.chains.static.defaults.controller = index routes.hostname.chains.objects.type = "Zend_Controller_Router_Route_Regex" routes.hostname.chains.objects.route = "([a-z]+(?:-[a-z]+)?)s(?:/([a-z]+)?)?" routes.hostname.chains.objects.defaults.action = list routes.hostname.chains.objects.map.1 = "controller" routes.hostname.chains.objects.map.2 = "action" routes.hostname.chains.objects.reverse = "%ss/%s" routes.hostname.chains.object.type = "Zend_Controller_Router_Route_Regex" routes.hostname.chains.object.route = "([a-z]+(?:-[a-z]+)?)s/([0-9a-f]{32})(?:/([a-z]+))?" routes.hostname.chains.object.defaults.action = view routes.hostname.chains.object.map.1 = "controller" routes.hostname.chains.object.map.2 = "id" routes.hostname.chains.object.map.3 = "action" routes.hostname.chains.object.reverse = "%ss/%s/%s" routes.hostname.chains.children.type = "Zend_Controller_Router_Route_Regex" routes.hostname.chains.children.route = "((?:[a-z]+s/[1-9]\d*/)*)([a-z]+(?:-[a-z]+)?)s/([0-9a-f]{32})/([a-z]+(?:-[a-z]+)?)s(?:/([a-z]+))?" routes.hostname.chains.children.defaults.action = list routes.hostname.chains.children.map.1 = "ancestors" routes.hostname.chains.children.map.2 = "parent_cls" routes.hostname.chains.children.map.3 = "parent_id" routes.hostname.chains.children.map.4 = "controller" routes.hostname.chains.children.map.5 = "action" routes.hostname.chains.children.reverse = "%s%ss/%s/%ss/%s" 发现程序中生成的url的端口号全部丢失。仔细看代码源码发现Zend_Controller_Router_Route_Chain中的assemble方法 public function assemble($data = array(), $reset = false, $encode = false) { $value = ''; foreach ($this->_routes as $key => $route) { if ($key > 0) { $value .= $this->_separators[$key]; } $value .= $route->assemble($data, $reset, $encode); if (method_exists($route, 'getVariables')) { $variables = $route->getVariables(); foreach ($variables as $variable) { $data[$variable] = null; } } } return $value; } 循环调用路由,但是在Zend_Controller_Router_Route_Hostname中的match方法中 // Get the host and remove unnecessary port information $host = $request->getHttpHost(); if (preg_match('#:\d+$#', $host, $result) === 1) { $host = substr($host, 0, -strlen($result[0])); } 这段去掉了端口号,而Zend_Controller_Router_Route_Chain中有将这里返回的url与后面的url拼接,这样产生的url端口自然就丢失了。不知道当时作者为什么要这样写,是不是因为有其他的原因?返回带端口的url有何不可?希望对PHP熟悉的人给予解释。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |