我对 mod_rewrite 和用正则表达式替换多个变量有点困惑。我试图重写以下内容:
www.mysite.com/avatars/funny/1
进入:
www.mysite.com/avatars.php?genre=funny&page=1
目前,我有以下内容,但这并没有真正起到作用:
RewriteRule ^/avatars/?(.*)/?(.*)$ /avatars.php?genre=$1&page=$2
答案1
操作员*
很贪婪。这意味着它会抓取尽可能多的东西。
在您的示例中,第一个(.*)
块将匹配/funny/1
。第二个块将不匹配任何内容,但没关系,因为*
它匹配“零个或多个”前一个字符。
使用不同的块来匹配斜线之间的部分即可。如下所示:
RewriteRule ^/avatars/([a-z]*)/([0-9]*)$ /avatars.php?genre=$1&page=$2
或这个:
RewriteRule ^/avatars/([^/]+)/([^/]+)$ /avatars.php?genre=$1&page=$2
斜杠后面也不需要运算符?
,因为为了有两个变量,必须有斜杠。
Apache 还有不情愿的与贪婪运算符相反的运算符。你可以在通常的贪婪运算符后添加问号来使用这些运算符。如下所示:
RewriteRule ^/avatars/(.*?)/(.*?)$ /avatars.php?genre=$1&page=$2
答案2
您不需要,?
因为斜线不是可选的。但是,一旦应用此规则,您可能需要停止处理([L])。您可以尝试以下操作吗?
RewriteRule ^/avatars/(.*)/(.*)$ /avatars.php?genre=$1&page=$2 [L]
答案3
我认为您使用的 /? 有问题,请尝试以下操作:
RewriteEngine on
RewriteRule ^avatars/([^/]+)/([^/]+)$ avatars.php?genre=$1&page=$2 [L]