Mod Rewrite:处理两个Get变量

时间:2010-05-17 20:12:19

标签: apache mod-rewrite

如何编辑此url重写以包含附加到URL的其他get变量?我尝试了一些尝试,但我总是得到500内部服务器错误!

我添加了评论以显示我想要实现的目标。

# /view.php?user=h5k6&page=1 externally to /h5k6/1
# Some times the page get variable will not exist so it should just show /h5k6
RewriteCond %{THE_REQUEST} ^GET\ /view\.php
RewriteCond %{QUERY_STRING} ^([^&]*&)*user=([^&]+)&?.*$
RewriteRule ^view\.php$ /%2? [L,R=301]

# /h5k6/1 internally to /view.php?t=h5k6&page=1
RewriteRule ^([0-9a-z]+)$ view.php?t=$1 [L]

感谢大家的帮助

1 个答案:

答案 0 :(得分:1)

URI查询参数的问题在于它们可能以任何顺序出现。有两个参数,你只有两个排列( A在B 之前, B在A 之前)。但是,您想要提取的参数越多(n!)。

这意味着您应该按正确的顺序放置参数,以便您可以一次使用它们:

RewriteCond %{THE_REQUEST} ^GET\ /view\.php
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)(page=[^&]+)&?([^&].*)?$
RewriteCond %3&%1%4 ^(([^&]*&)*)(user=[^&]+)&?([^&].*)?$
RewriteCond %3&%1%4 ^user=([^&]+)&page=([^&]+)&?([^&].*)?$
RewriteRule ^view\.php$ /%1/%2?%3 [L,R=301]

第一个条件会像您的规则一样检查请求行。第二个条件选择参数并将其放在查询字符串的开头。第三个条件与 user 参数相同,因此顺序始终为:first user ,second page 。然后我们使用第四个条件一次获取两个参数值,以便在RewriteRule替换中使用它们。查询的其余部分将附加到替换URI(请参阅%3),但如果需要,可以将其保留。

如您所见,要提取的参数越多,获得的参数就越复杂。使用比PHP更强大的语言更容易做到这一点。