Php 有没有一种方法可以创建一个Zend_控制器_路由器,它匹配/text但不匹配/text/?

Php 有没有一种方法可以创建一个Zend_控制器_路由器,它匹配/text但不匹配/text/?,php,zend-framework,Php,Zend Framework,我正在尝试将没有尾随斜杠的URL与一个路由器进行匹配,并希望那些带有尾随斜杠的URL以正常方式运行。我试过: $route = new Zend_Controller_Router_Route( ':redirectid', array( 'redirectid' => false, 'controller' => 'redirect',

我正在尝试将没有尾随斜杠的URL与一个路由器进行匹配,并希望那些带有尾随斜杠的URL以正常方式运行。我试过:

$route = new Zend_Controller_Router_Route(
            ':redirectid',
            array(
                'redirectid'    =>  false,
                'controller'    =>  'redirect',
                'action'    =>  'redirect'
            ),
            array('redirectid' => '[a-z0-9]*')
        );


两者的行为都与我想要的没有尾随斜杠的URL的行为完全相同,但它们仍然匹配有尾随斜杠的URL。有什么办法解决这个问题吗?

免责声明: 我强烈建议不要制作和成为不同的页面——这会让你和你的访问者感到困惑

如果您真正致力于此计划 您可以创建自己的路由器,您可以通过创建自己的match()和assembly()函数来处理此问题,这些函数不会
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'];
    }
} 
这是空气编码的,所以它可能有一两个bug需要解决-它应该是这样工作的:

$route = new My_Route_Redirector(
                array(
                        'controller' => 'redirect',
                        'action'     => 'redirect'
                )
        );

非常感谢你!它工作得很好,只是$path仍然包含开头/,“#^/([a-z0-9]+)$#i”使它工作。事实上,我确实在为do it/don it而与自己斗争——这是为了一个tinyurl式的重定向器,我不只是想匹配所有内容,所以我仍然可以使用/admin/或/stats/等。为这些设置特定的路由可能更可取,我得考虑一下这个问题。你可以把基本的:controller/:action路由降到/admin/index/,对吗?是的,这就是我最后要做的-基本上我只需要一个参数(/admin/)和一个静态路由来路由我需要的路由,那些有多个(/admin/options/)的路由无论如何,我都会使用adminController。我只是想再看一次-你可以让这个自定义路由只在找到与你的DB行匹配的内容时返回值-它甚至可以设置“redirectTo”参数。然后/admin仍然是一个“默认”路由-你不需要特殊情况的静态。嗯,我喜欢这个想法-即使它会去掉重定向控制器的所有逻辑,毕竟,如果我查询数据库,我可以直接在路由器中重定向。
$route = new My_Route_Redirector(
                array(
                        'controller' => 'redirect',
                        'action'     => 'redirect'
                )
        );