为什么这个htaccess规则将两个匹配分配给一个$ _GET变量?

时间:2012-10-24 21:35:39

标签: php .htaccess mod-rewrite get

以下是我网站个人资料页面的htaccess规则:

RewriteRule ^users/([0-9]+)/?(.+)?/?(.+)? profile.php?id=$1&slug=$2&tab=$3&%{QUERY_STRING}

点击用户个人资料上的标签页,例如收藏夹

  

/用户/ 83028 /森 - 约翰逊/收藏夹

名称为 slug $_GET变量正在接收nathan-johnson/favorites而不只是nathan-johnsontab变量为空白,根据var_dump

array(3) { 
      ["id"]=> string(5) "83028" 
      ["slug"]=> string(24) "nathan-johnson/favorites" 
      ["tab"]=> string(0) "" }

看起来问题出在我的htaccess regexp(上图)上,但我没有看到它的问题。

提前致谢。

1 个答案:

答案 0 :(得分:0)

因为你的正斜杠是可选的(通过/?),所以(.+)分组是贪婪的并且会全部吞噬它们。你需要通过添加 :(。+?)

来使它们变得非贪婪

此外,您应该使用(.+)?代替*而不是{1}},而不是{1}}。

尝试:

RewriteRule ^users/([0-9]+)/?([^/]*)/?(.*?)?$ profile.php?id=$1&slug=$2&tab=$3&%{QUERY_STRING}

此外,您可以只使用%{QUERY_STRING}标记,而不是使用QSA

RewriteRule ^users/([0-9]+)/?([^/]*)/?(.*?)?$ profile.php?id=$1&slug=$2&tab=$3 [L,QSA]