Zend framework Zend主机名路由器和url帮助程序:丢失端口
我想保留我的端口号,这在生产和开发环境中是不同的,但是基于我的zend路由调用url帮助程序时忘记了端口号 我的路由是一组regexp路由,与默认主机名路由链接,主要用于多域配置上的多语言(下面简要概述)Zend framework Zend主机名路由器和url帮助程序:丢失端口,zend-framework,zend-route,Zend Framework,Zend Route,我想保留我的端口号,这在生产和开发环境中是不同的,但是基于我的zend路由调用url帮助程序时忘记了端口号 我的路由是一组regexp路由,与默认主机名路由链接,主要用于多域配置上的多语言(下面简要概述) 其中$config->serverurl只是域名,具体取决于环境,并在my application.ini文件中配置 在我的生产服务器上,这没关系,因为我在默认端口80上运行,但在developmenet上,我需要在不同的端口上运行,每次调用url帮助器时,端口号都会被忘记 我知道我可以通
其中$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]));
}
我相信有三种不同的方法可以解决你的问题:
Zend_注册表::set('PORT_NUMBER',$this->getOption('portnumber')代码>
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;
}
}