mod_rewrite与上一场比赛不匹配



输入网址:application.local/v2/en-us/login

预期输出网址:application.local/app_dev.php/en-us/login

这里唯一的区别是我们用/app_dev.php替换/v2/。这是我的重写规则。

RewriteRule ^/(v2)?/(([A-Za-z]+-[A-Za-z]+)|_(.*)+)?/(.*)+?$ /app_dev.php/$2/$3 [R,L]

按顺序,我的逻辑是:

  • 匹配/v2/(这进入$1或Symfony使用的_profiler,_wdt等
  • 匹配区域设置(这将进入$2
  • 匹配后面的东西,在这种情况下:login(这在$3

但是,$3并没有像我期望的那样包含login,而是得到:

application.local/app_dev.php/en-us/en-us

虽然我有/v2/的替代品,/app_dev.php工作,但我认为我在某个地方搞砸了$2$3之间的比赛,login.我做错了什么?

^/(v2)?/(([A-Za-z]+-[A-Za-z]+)|_(.*)+)?/(.*)+?$
  ||||  ||||||||||||||||||||||||||||||  ||||
  1111  2|||||||||||||||||||||22||||22  5555
         333333333333333333333  4444

你有计数的内部组,我添加了数字,以便您轻松查看它。

这应该有效:

RewriteRule ^/(v2)?/(([A-Za-z]+-[A-Za-z]+)|_(.*)+)?/(.*)+?$ /app_dev.php/$2/$5 [R,L]

您可以使用复杂的正则表达式,而是可以路由所有内容。

RewriteRule ^/v2/(.*)$ /app_dev.php/$1 [R,L]

最新更新