CakePHP路由正则表达式匹配不正确


CakePHP route regex not matching correctly

在将我的CakePHP版本从2.2.2更新到2.6.2之后,我的一个路由停止正常工作。

Router::connect('/articles/:keywords', array('action' => 'search', 'controller' => 'Articles', 'keywords' => null), array('pass' => array('keywords'), 'keywords' => '[A-Za-z0-9'+_]+'));

它通过网址(如website.com/articles/World+News)获取"世界"answers"世界+新闻"等输入,并将articles/后面的内容传递给articles控制器中的搜索功能。在更新之前,这一切都很顺利。现在,如果有字母数字字符以外的其他字符,它将通过该路线并转到我的"找不到路线"路线。这就像正则表达式没有正确匹配。例如,"世界"answers"世界123"会起作用,但"世界+新闻"不会。

我尝试过的东西:

  1. 将正则表达式更改为.*只是为了看看它是否有效。确实如此
  2. 将路由从:keywords更改为*,看看它是否有效。确实如此
  3. 尝试一些我知道会失败的东西,比如在匹配中排除任何带有字母的东西。它未能按预期使用此路由

我到处搜索,尝试各种regex组合(我在测试中成功匹配的那些),通常只是想找出为什么这条路线会匹配,但我做不到。在更新之前,它运行良好,我在CakePHP文档中找不到任何东西来说明为什么它不起作用。据我所知,这些表达式是正确的,我已经使用regex测试仪确认它们完全匹配。任何帮助都将不胜感激,谢谢!

实际上问题是正则表达式,至少它是问题的一部分。

在早期版本中,CakePHP将原始URL传递到匹配主题中,但这相当有问题,因为它可能需要非常难看的正则表达式,尤其是对于非ASCII字符。现在URL解码的变体正在传递:

https://github.com/cakephp/.../commit/d5283af818b59c5d96355d6e42bbd77e1322d8cb

因此,由于+在URL编码中有着特殊的含义,并且实际上代表空白,您的正则表达式将不再匹配。它很容易修复,只需匹配一个空白而不是+