`
sagahl
  • 浏览: 23816 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Zend_Controller_Router_Route_Hostname和端口

阅读更多

最近在配置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熟悉的人给予解释。

分享到:
评论

相关推荐

    Zend Framework教程之路由功能Zend_Controller_Router详解

    主要介绍了Zend Framework教程之路由功能Zend_Controller_Router,详细分析了路由功能Zend_Controller_Router的原理,使用技巧与相关注意事项,需要的朋友可以参考下

    Trace_Router.zip_route_router _router tra_trace_trace router

    在标签中,"route router"和"tra_trace_trace router"进一步强调了与路由和追踪相关的主题。这些标签可能用于分类或搜索,便于用户找到这个程序。 在压缩包的文件名列表中,我们看到以下几个关键文件: 1. `tracer...

    Zend Framework中文手册

    通过 `Zend_Controller_Router` 和 `Zend_Controller_Router_Route` 类,你可以创建自定义路由规则,以满足不同应用场景的需求。 5. **视图(Views)** 视图负责呈现应用程序的数据。`Zend_View` 类提供了一种模板...

    zfcn.rar_ZendFramework

    5. **路由与调度**:Zend_Controller_Front 负责请求的接收和分发,而 Zend_Controller_Router 和 Zend_Controller_Dispatcher 则负责路由配置和控制器的调用,使得 URL 映射和处理更加灵活。 6. **视图助手**:...

    ZF1.5.2中文手册

    通过 `Zend_Controller_Router` 和 `Zend_Controller_Dispatcher`,系统能够智能地路由请求到正确的模块。 ### 视图(View) 视图主要由一系列模板文件组成,用于呈现数据。`Zend_View` 类提供了一种机制,可以将...

    zend framework 最新手册

    8. **路由和调度(Routing and Dispatching)**:Zend_Controller_Front 负责接收请求并调度到相应的控制器和动作,而 Zend_Controller_Router 和 Zend_Controller_Dispatcher 处理 URL 路由和请求分发。 9. **国际...

    ZendFramework-1.7.2帮助文档

    - **路由和调度**:`Zend_Controller_Router` 和 `Rewrite` 负责解析 URL 并调度到相应的控制器和动作。 - **表单处理**:`Zend_Form` 支持创建复杂的表单,包含验证、过滤和装饰器功能。 - **缓存**:`Zend_Cache` ...

    Zend Frameword 小例子源码

    2. **路由和调度**:`Zend_Controller_Router` 和 `Zend_Controller_Front` 负责路由和调度请求,可以设置过滤规则,防止非法访问。 3. **访问控制**:通过 `Zend_Acl` (访问控制列表)实现角色基

    ZendFramework中文文档

    Zend_Controller_Router_Route_Static 7.5.6.3. Zend_Controller_Router_Route_Regex 7.5.7. 使用 Zend_Config with the RewriteRouter 7.5.8. Subclassing the Router 7.6. 分发器 7.6.1. 概述 7.6.2. 子类...

    Vue__Vuex__VueRouter_相关项目源代码阅读总结_Vue_source_code.zip

    Vue__Vuex__VueRouter_相关项目源代码阅读总结_Vue_source_code

    Using_Linux_As_A_Router.rar_router

    Using Linux As A Router

    h_routerh_routerh_router

    2. **配置指南**:如何通过命令行界面(CLI)或图形用户界面(GUI)进行基本和高级配置,例如IP地址分配、路由协议(如OSPF, BGP)、VLAN划分、端口安全设置等。 3. **实验实践**:“华为路由器实验.chm”可能包含...

    Zend Framework 简介

    通过 Zend_Controller_Router_Route 和 Zend_Rest_Server 类,开发者可以轻松地创建和消费 REST API,促进前后端分离和微服务架构的发展。 **表单处理** Zend_Form 是处理 HTML 表单的强大工具,它可以自动生成...

    rtl.tar.gz_Verilog router_router _router verilog_router vhdl_rou

    This is RTL of Router by uisng verilog

    1584374652716972_com.xiaomi.router.apk

    1584374652716972_com.xiaomi.router.apk

    ospfd.rar_ospf_abr_ospfd_router _the code

    标题中的"ospfd.rar_ospf_abr_ospfd_router_the code"暗示了这是一个与OSPF(开放最短路径优先)路由协议相关的源代码压缩包,重点在于ABR(Area Border Router,区域边界路由器)和ospfd路由器。ospfd通常是实现...

    fifo.rar_ ROUTER VHDL_fifo router vhdl_fifo vhdl_noc _router

    2. **多端口接口**:路由器通常有多个输入和输出端口,每个端口可能有不同的速率和协议,FIFO可以缓解这种速率不匹配的问题。 3. **流量控制**:通过FIFO,路由器可以实施简单的流量控制策略,防止输入数据过快导致...

Global site tag (gtag.js) - Google Analytics