我在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变量。
答案 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}}。