RewriteMap不适用于具有查询参数的网址

时间:2013-05-31 14:43:44

标签: apache .htaccess mod-rewrite rewritemap

似乎rewritemap没有考虑匹配url中的查询参数。请提出解决方案。

我在httpd.conf文件中的设置:

RewriteMap redirects dbm=db:/usr/local/apache/conf/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

重定向文件有url lile

/same_url/ http://mysite.com/
/same_url/?q=1 http://mysite.com/q2=1
/same_url/?q=2 http://mysite.com/q2=2
/same_url/?q=3 http://mysite.com/q2=3

但是所有4个网址都只被定向到http://mysite.com。因此,似乎只对非查询部分进行匹配。

请帮忙。

1 个答案:

答案 0 :(得分:3)

查看您的RewriteMap,您似乎不需要使用地图。 你可以在没有地图的情况下做到这一点:

RewriteCond %{QUERY_STRING} ^q\=([0-9]+)$
RewriteRule ^/same_url/(.*)$ http://example.com/q2=%1 [redirect=permanent,last]

注意RewriteRule中的%1反向引用RewriteCond中的匹配。

如果您仍想使用重写映射,则可能必须将查询字符串“转换”为路径中的某些内容 规则可以是:

RewriteCond %{QUERY_STRING} ^q\=([0-9]+)$
RewriteRule ^/(.*)$ /$1/q=%1   <-- here the GET param is transformed to something in the path

RewriteMap redirects dbm=db:/usr/local/apache/conf/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

您必须将地图更改为不考虑GET参数的内容:

/same_url/ http://example.com/
/same_url/q=1 http://example.com/q2=1
/same_url/q=2 http://example.com/q2=2
/same_url/q=3 http://example.com/q2=3