Zend Hostname Routeur和url helper:丢失端口

时间:2010-02-10 15:51:46

标签: zend-framework zend-route

我想保留生产和开发环境不同的端口号,但是根据我的zend路由调用url helper会忘记端口号。

我的路由是一堆正则表达式路由,使用默认主机名路由链接,主要用于多域配置的多语言(下面简短概述)。

<?php
    $routecateg = new Zend_Controller_Router_Route_Regex('cat/(\w+)_([^_]+)(?:_page_(\d+))?(?:_par_(\d+))?(?:.html)?',
    array(1 =>'',2=>'',3=>'1',4=>'20','controller' =>'list','action'=>'categ'),
    array(1 =>'categid',2=>'categname',3=>'page',4=>'par'),
    'cat/%s_%s_page_%d_par_%d.html'
);

$routeindex= new Zend_Controller_Router_Route_Regex('(index|home)?',
    array('controller' =>'index','action'=>'home'),
    array(),
    'index'
);    

$hostRouteRepository = new Zend_Controller_Router_Route_Hostname(
    ':lang.'.$config->serverurl
);
$router ->addRoute('index',$hostRouteRepository->chain($routeindex));
$router ->addRoute('categ',$hostRouteRepository->chain($routecateg));
?>

其中$ config-&gt; serverurl只是域名,具体取决于环境并在我的application.ini文件中配置。

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

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

1 个答案:

答案 0 :(得分:2)

这是我发现的:

如果您将类似':lang.example.com:8888'或':lang.example.com:port'的内容传递给Zend_Controller_Router_Route_Hostname的构造函数,则端口部分将无法正确解析(com:8888或com) :港口)。这是因为字符串以'。'爆炸。字符和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++;
            }
        }

现在,在路由匹配功能(函数匹配($ 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]));
    }

我相信有3种不同的方法可以解决您的问题:

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

    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不应该这样,因为端口号是变量。

    希望有所帮助。