Php 我可以通过mod_rewrite将匹配的变量传递到新URL吗?

Php 我可以通过mod_rewrite将匹配的变量传递到新URL吗?,php,apache,url,mod-rewrite,get,Php,Apache,Url,Mod Rewrite,Get,我在PHP方面很有经验,但我不太会使用mod_rewrite(尽管我应该这么做)。我想问的是,是否有可能通过一个重写规则传递多个变量 例如,是否可以重写以下内容: localhost/test.php?id=1&name=test&var1=3 为此: localhost/mysupertest/ 对不同的值也使用相同的重写规则 localhost/test.php?id=5&name=another_name&var3=42 进入 我知道可以使用Ajax、

我在PHP方面很有经验,但我不太会使用
mod_rewrite
(尽管我应该这么做)。我想问的是,是否有可能通过一个重写规则传递多个变量

例如,是否可以重写以下内容:

localhost/test.php?id=1&name=test&var1=3
为此:

localhost/mysupertest/
对不同的值也使用相同的重写规则

localhost/test.php?id=5&name=another_name&var3=42
进入


我知道可以使用Ajax、cookie、session或POST变量来完成,但我确实希望使用GET变量。

是的,这是可能的。任何与正则表达式匹配的内容都可以重写为任何url。任何时候,只要将正则表达式字符串的一部分放在括号()内,它就会成为一个变量,可以在重写时使用

你可能会想要(我想):

RewriteRule test.php\?id=[0-9]+&name=.+&var1=[0-9]+mysuperest/


绝对有可能。像这样的东西可以做到:

RewriteRule test.php\?(.*)$ mysupertest/
但是,如果这样做,您将丢失变量,因为这实际上与直接访问localhost/mysuperest相同,没有查询字符串数据。如果希望保留变量(可能是REST样式的url),可以使用反向引用重写它们。正如John提到的,反向引用只是一组括号,括号内的任何匹配项都将成为数字排序方案中的变量

RewriteRule test.php\?id=(.*)&name=(.*)&var3=(.*)  mysupertest/$1/$2/$3

根据上述规则,访问
test.php?id=567&name=test&var3=which
与访问
mysuperest/567/test/which
我不太确定您要的是什么,但您可能应该使用
[QSA]
选项进行修改,它将附加“
”之后的所有URL参数。例如:

RewriteRule ^mysupertest/? test.php [QSA]

查看更多详细信息。

查询字符串不是URI的一部分。从以下文件中:

注意:查询字符串

如果希望与主机名、端口或查询字符串匹配,请分别使用
%{HTTP\u HOST}
%{SERVER\u port}
%{query\u string}
变量


是否确实要将
/test.php?id=1&name=test&var1=3的请求重定向到
/mysuperest/
?或者相反,请求
/mysuperest/
/test.php?id=1&name=test&var1=3
?基本上我想重写对象类别的分页。假设我正在浏览类别supertest。我不想为每个页面显示mysuperest/page/1/或mysuperett/page/2,而是显示mysuperest/
RewriteRule ^mysupertest/? test.php [QSA]