Php 为什么此htaccess规则将两个匹配项分配给一个$\u GET变量?

Php 为什么此htaccess规则将两个匹配项分配给一个$\u GET变量?,php,.htaccess,mod-rewrite,get,Php,.htaccess,Mod Rewrite,Get,以下是我的站点配置文件页面的htaccess规则: RewriteRule ^users/([0-9]+)/?(.+)?/?(.+)? profile.php?id=$1&slug=$2&tab=$3&%{QUERY_STRING} 当您单击用户配置文件上的选项卡时,如“收藏夹”: /用户/83028/nathan johnson/favorites 根据var\u dump,名为slug的$\u GET变量正在接收nathan johnson/favorites,而不

以下是我的站点配置文件页面的htaccess规则:

RewriteRule ^users/([0-9]+)/?(.+)?/?(.+)? profile.php?id=$1&slug=$2&tab=$3&%{QUERY_STRING}
当您单击用户配置文件上的选项卡时,如“收藏夹”:

/用户/83028/nathan johnson/favorites

根据
var\u dump
,名为slug的
$\u GET
变量正在接收
nathan johnson/favorites
,而不仅仅是
nathan johnson
,并且
选项卡
变量为空:

array(3) { 
      ["id"]=> string(5) "83028" 
      ["slug"]=> string(24) "nathan-johnson/favorites" 
      ["tab"]=> string(0) "" }
看起来问题出在我的htaccess regexp(如上)上,但我看不出它有什么问题


提前感谢。

因为您的前向斜杠是可选的(通过
/?
),因此,
(.+)
分组贪婪,并且会吞噬它们。您需要通过添加:(.+?)使它们不贪婪

此外,您应该使用一个
*
来代替
(.+)?
,这意味着没有、一个或多个

尝试:

另外,您可以使用
QSA
标志,而不是使用
%{QUERY\u STRING}

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

我不确定什么?应该这样做,但当我做类似的事情时,我通常使用([^/]*)来代替它things@JohnB
使匹配在它之前是可选的,因此不需要在那里使规则生效。和
匹配任何字符(
+
表示需要多少字符)。谢谢,但它似乎仍然不起作用,
slug
tab
变量现在都没有值:
数组(3){[“id”]=>string(5)“83028”[“slug”]=>string(0)”[“tab”]=>string(0)”}
有什么想法吗?@Nathan抱歉,没有看到你到底想做什么。正则表达式中缺少了一些东西,您需要在末尾使用
$
,这样非贪婪匹配就可以得到所有东西。然后您需要将中间路径替换为
([^/]*)
,以确保最后一个非贪婪路径不会吞噬它
RewriteRule ^users/([0-9]+)/?([^/]*)/?(.*?)?$ profile.php?id=$1&slug=$2&tab=$3 [L,QSA]