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\+_]+'));

它通过 url(例如网站)接收 "World" 和 "World+News" 等输入。com/articles/World+News 并将 articles/ 之后的内容传递给搜索功能在文章控制器中。在更新之前,这一切都很好。现在,如果除了字母数字字符之外还有其他任何内容,它将向上传递路线并转到我的 "cannot find route" 路线。这就像正则表达式没有正确匹配。例如"World" 和 "World123" 会起作用,但 "World+News" 不会。

我尝试过的事情:

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

我一直在到处搜索,尝试各种正则表达式组合(我在测试器中成功匹配的组合),并且通常只是想找出为什么这条路线会匹配但我做不到。这在更新之前工作正常,我在 CakePHP 文档中找不到任何可以说明为什么这不起作用的内容。据我所知,表达式是正确的,并且我已经使用正则表达式测试器确认它们完全匹配。任何帮助将不胜感激,谢谢!

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

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

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

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