我正在尝试将没有尾部斜杠的URL匹配到一个路由器,并且希望具有尾部斜杠的URL表现正常。我试过了:
$route = new Zend_Controller_Router_Route(
':redirectid',
array(
'redirectid' => false,
'controller' => 'redirect',
'action' => 'redirect'
),
array('redirectid' => '[a-z0-9]*')
);
和
$route = new Zend_Controller_Router_Route_Regex(
'([a-z0-9]*)',
array(
'controller' => 'redirect',
'action' => 'redirect'
)
);
并且两者都表现出我想要的网址而没有尾随斜杠,但它们仍匹配带尾部斜杠的网址。有没有办法解决这个问题?
答案 0 :(得分:2)
<强>声明:强> 我强烈建议不要让http://somesite.com/page和http://somesite.com/page/成为不同的网页 - 这会让您和访问者感到困惑。
如果您真的致力于此计划
您可以通过创建自己的match()和assemble()函数来创建自己的路由器来处理这个问题,这些函数不会trim()
基于尾部斜杠的路径。
class My_Route_Redirector implements Zend_Controller_Router_Route_Interface {
protected $_defaults;
public static function getInstance(Zend_Config $config) {
$defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array();
return new self($defs);
}
public function __construct($defaults=array()) {
$this->_defaults = $defaults;
}
public function match($path, $partial = false) {
if (preg_match("#^/?([a-z0-9]+)$#i", $path, $matches)) {
// this is just an idea but what about if you had this test
// $matches[1] versus the database of redirectors? and only return true
// when it found a valid redirector?
return array('redirectid' => $matches[1]) + $this->_defaults;
} else {
return false;
}
}
public function assemble($data = array(), $reset = false, $encode = false, $partial = false)
{
if (!isset($data['redirectid'])) return '';
return $data['redirectid'];
}
}
这是空气编码所以它可能有一两个错误 - 它应该像这样工作:
$route = new My_Route_Redirector(
array(
'controller' => 'redirect',
'action' => 'redirect'
)
);