我想保留生产和开发环境不同的端口号,但是根据我的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服务器来解决这个问题,但我很惊讶没有找到任何解决此问题的方法。
答案 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种不同的方法可以解决您的问题:
Zend_Registry::set('PORT_NUMBER', $this->getOption('portnumber'));
注意:解决方案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不应该这样,因为端口号是变量。
希望有所帮助。