重写引擎:URL中的查询无法正常工作。也许Regex错了?
我有这样一个url:重写引擎:URL中的查询无法正常工作。也许Regex错了?,regex,.htaccess,mod-rewrite,Regex,.htaccess,Mod Rewrite,我有这样一个url: index.php?lang=de&menu=products&sub1=heat&sub2=M123 RewriteRule ^(de|at|ch|it|nl)/?(.*)/?(.*)/?(.*)$ index.php?lang=$1&menu=$2&sub1=$3&sub2=$4 只有字段“lang”是必填字段,因此my.htaccess如下所示: index.php?lang=de&menu=products
index.php?lang=de&menu=products&sub1=heat&sub2=M123
RewriteRule ^(de|at|ch|it|nl)/?(.*)/?(.*)/?(.*)$ index.php?lang=$1&menu=$2&sub1=$3&sub2=$4
只有字段“lang”是必填字段,因此my.htaccess如下所示:
index.php?lang=de&menu=products&sub1=heat&sub2=M123
RewriteRule ^(de|at|ch|it|nl)/?(.*)/?(.*)/?(.*)$ index.php?lang=$1&menu=$2&sub1=$3&sub2=$4
当我读$\u GET时,我得到了下面的代码…但是我想填充所有变量
[lang] => at
[menu] => products/heat/M123
[sub1] =>
[sub2] =>
这是我第一次使用regex和rewriteengine。对于这个可能很愚蠢的问题,我深表歉意。请使用相同的替换字符串尝试以下操作:
^(de|at|ch|it|nl)(?:/([^/]*))?(?:/([^/]*))?(?:/([^/]*))?$
因此:
解释
*
是贪婪的,因为第一个*
后面的字符都不必匹配(/?
和剩余的*
都可以不匹配任何内容),所以它会立即匹配字符串的其余部分,而所有其他组最终都是0长度匹配
通常,通过设置一个*
惰性-*?
,可以解决问题,但在这种情况下(我通过失败的测试发现),惰性量词仍然会匹配字符串的结尾,因为它似乎需要一些具体的匹配,显然,匹配可选的/
不足以优先
为了解决这个问题,我将/?.
替换为(?:/([^/]*))?
(?:…)
仅表示不捕获此组(如$1$2等)
因此忽略每个组都有(/([^/]*)?
每个组都是可选的,并且必须匹配一个/
,后跟0个非-/
字符。通过这种方式,你可以确保*不会贪婪地消费下一组
一个稍微短一点的正则表达式(我的原始正则表达式)也可以使用,但有点难以解释:
^(de|at|ch|it|nl)(?:/(.*?))?(?:/(.*?))?(?:/(.*?))?$
它可以工作…但是当我这样做:/de/products/heat…以及当我这样做/de/products或这个/de/products/时,页面无法找到。