我可以使用mod_rewrite将匹配的变量传递给新URL吗?

时间:2009-06-30 22:41:01

标签: 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

localhost/mysupertest/

我知道可以使用Ajax,cookie,session或POST变量来完成,但我真的想使用GET变量。

4 个答案:

答案 0 :(得分:1)

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

RewriteRule test.php\?(.*)$ mysupertest/

但是,如果你这样做,你将失去你的变量,因为它实际上与直接访问localhost / mysupertest相同,没有查询字符串数据。如果要保留变量(可能在REST样式的URL中),可以使用反向引用来重写它们。正如约翰所提到的,反向引用只是一组括号,它们内部的任何匹配都成为数字排序方案中的变量。

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

根据上述规则,访问test.php?id=567&name=test&var3=whatever与访问mysupertest/567/test/whatever

相同

答案 1 :(得分:1)

我不确定您要求的是什么,但您可能应该使用mod_rewrite的[QSA]选项,该选项将追加“?”之后的所有网址参数。例如:

RewriteRule ^mysupertest/? test.php [QSA]

请查看this question了解详情。

答案 2 :(得分:0)

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

你会想要(我认为):

  

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

答案 3 :(得分:0)

QUERY_STRING不是URI的一部分。来自RewriteRule的文档:

  

注意:查询字符串

     

如果您希望与主机名,端口或查询字符串匹配,请分别使用%{HTTP_HOST}%{SERVER_PORT}%{QUERY_STRING}变量{/ 3}}。