0

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

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

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

重定向文件有 urls

/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 个 url 都只被定向到http://mysite.com。所以看起来匹配只针对非查询部分进行。

请帮忙。

4

1 回答 1

3

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

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

注意%1RewriteRule 中的反向引用到 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
于 2013-06-01T19:37:40.993 回答