mod_rewrite与上一场比赛不匹配

时间:2016-02-23 13:13:09

标签: regex mod-rewrite

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

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

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

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

按顺序,我的逻辑是:

  • 匹配/v2/(这将进入$1或_profiler,_wdt等Symfony使用
  • 匹配语言环境(这会进入$2
  • 匹配之后的内容,在这种情况下:login(此内容为$3

但是,$3并不像我预期的那样包含login,而是我得到:

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

虽然我已取代/v2//app_dev.php工作,但我认为我正在弄清$2$3之间的匹配login 。我做错了什么?

1 个答案:

答案 0 :(得分:4)

^/(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]