Zend framework Zend主机名路由器和url帮助程序:丢失端口

Zend framework Zend主机名路由器和url帮助程序:丢失端口,zend-framework,zend-route,Zend Framework,Zend Route,我想保留我的端口号,这在生产和开发环境中是不同的,但是基于我的zend路由调用url帮助程序时忘记了端口号 我的路由是一组regexp路由,与默认主机名路由链接,主要用于多域配置上的多语言(下面简要概述) 其中$config->serverurl只是域名,具体取决于环境,并在my application.ini文件中配置 在我的生产服务器上,这没关系,因为我在默认端口80上运行,但在developmenet上,我需要在不同的端口上运行,每次调用url帮助器时,端口号都会被忘记 我知道我可以通

我想保留我的端口号,这在生产和开发环境中是不同的,但是基于我的zend路由调用url帮助程序时忘记了端口号

我的路由是一组regexp路由,与默认主机名路由链接,主要用于多域配置上的多语言(下面简要概述)


其中$config->serverurl只是域名,具体取决于环境,并在my application.ini文件中配置

在我的生产服务器上,这没关系,因为我在默认端口80上运行,但在developmenet上,我需要在不同的端口上运行,每次调用url帮助器时,端口号都会被忘记

我知道我可以通过更好地配置apache服务器来解决这个问题,但我很惊讶没有找到任何解决方案

以下是我的发现:

如果将诸如“:lang.example.com:8888”或“:lang.example.com:port”之类的内容传递给Zend_Controller_Router_Route_主机名的构造函数,则无法正确解析端口部分(com:8888或com:port)。这是因为字符串是用“.”字符分解的,并且hostVariable字符(“:”)仅在构造中分解部分的第一个字符上进行检查:

foreach (explode('.', $route) as $pos => $part) {
            if (substr($part, 0, 1) == $this->_hostVariable) {
                $name = substr($part, 1);
                $this->_parts[$pos] = (isset($reqs[$name]) ? $reqs[$name]
                                       : $this->_defaultRegex);
                $this->_variables[$pos] = $name;
            } else {
                $this->_parts[$pos] = $part;
                $this->_staticCount++;
            }
        }
现在,在路由匹配函数(函数match($request))中,从请求中丢弃端口号,这将阻止有效请求匹配路由:

// 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]));
    }
我相信有三种不同的方法可以解决你的问题:

  • 在config.ini文件中添加端口号选项,并将其注册到Zend_注册表,如下所示:
    Zend_注册表::set('PORT_NUMBER',$this->getOption('portnumber')
  • 修复函数match($request)中的代码以保留端口号(注释掉上面显示的代码就可以了)
  • 修复构造函数中的代码,以允许路由的“:port”参数化(设置路由时,您可能希望使用必需值或默认值)
  • 注意:解决方案2似乎比3容易,但需要做一些额外的工作,因为端口号将由汇编函数进行URL编码:

    foreach (array_reverse($host, true) as $key => $value) {
            if ($flag || !isset($this->_variables[$key]) || $value !== $this->getDefault($this->_variables[$key]) || $partial) {
                if ($encode) $value = urlencode($value);
                $return = '.' . $value . $return;
    
                $flag = true;
            }
        }
    
    解决方案3不应出现这种情况,因为端口号是一个变量

    希望有帮助

    foreach (array_reverse($host, true) as $key => $value) {
            if ($flag || !isset($this->_variables[$key]) || $value !== $this->getDefault($this->_variables[$key]) || $partial) {
                if ($encode) $value = urlencode($value);
                $return = '.' . $value . $return;
    
                $flag = true;
            }
        }