【问题标题】:Why is this htaccess rule assigning two matches to one $_GET variable?为什么这个 htaccess 规则将两个匹配项分配给一个 $_GET 变量?
【发布时间】:2012-10-24 21:35:38
【问题描述】:

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

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

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

/users/83028/nathan-johnson/favorites

根据var_dump,名称为slug$_GET 变量正在接收nathan-johnson/favorites 而不仅仅是nathan-johnson,并且tab 变量为空:

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

看起来问题出在我的 htaccess 正则表达式(上图),但我没有看到它的问题。

提前致谢。

【问题讨论】:

  • 我不肯定什么?(.+)?应该这样做,但是当我做类似的事情时,我通常使用 ([^/]*) 来代替它
  • @JohnB ?'s 使匹配在它之前可选,因此不需要在那里使规则起作用。 . 匹配任何字符(+ 表示需要的字符数)。

标签: php .htaccess mod-rewrite get


【解决方案1】:

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

使它们不贪婪

此外,您应该只使用 * 而不是 (.+)?,这意味着没有、一个或多个。

试试:

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

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

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

【讨论】:

  • 谢谢,但它似乎仍然不起作用,slugtab 变量现在都没有值:array(3) { ["id"]=> string(5) "83028" ["slug"]=> string(0) "" ["tab"]=> string(0) "" } 有什么想法吗?
  • @Nathan 对不起,没有看到你到底想做什么。正则表达式中缺少一些内容,您需要在末尾添加$,以便非贪婪匹配获取所有内容。然后你需要将中间路径替换为([^/]*),以确保最后一个非贪婪的不会吞噬它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
相关资源
最近更新 更多