通过mod_rewrite重写查询字符串中每次出现的模式

时间:2012-08-13 11:49:28

标签: apache mod-rewrite apache2

我对此表单的查询是朝向我的服务器:

http://my.host.com/moo?p=1&s=2&targetURL=http://foo.com/sub/more/query

我需要做的是替换此查询的一部分参数,具体而言我需要将http://foo.com/sub/替换为http://bar.com/,保留此查询中的所有其他参数并保留参数http://foo.com/sub/more/query。我会满足于在targetURL中替换它,所以我尝试了这个:

RewriteCond %{REQUEST_URI} ^/moo
RewriteRule ^/moo(.*)targetURL=http://foo.com/sub(.*)$ http://other.host.com/moo$1targetURL=http://bar.com$2 [L,R]
RewriteRule ^/moo(.*)$ http://other.host.com/moo$1 [L,R]

但第一个查询永远不匹配。有什么帮助吗?

编辑:为了说清楚,我有这个:

http://my.host.com/moo?p=1&s=2&targetURL=http://foo.com/sub/more/query

我希望它成为这个:

http://other.host.com/moo?p=1&s=2&targetURL=http://bar.com/more/query

2 个答案:

答案 0 :(得分:1)

试试这个我测试过的版本并为我工作。

<i> 

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^my\.host\.com/moo [NC,OR]
    RewriteCond %{QUERY_STRING} ^p\=1\&s=2\&targetURL\=http\:\/\/foo.com/sub/more/query$ [NC,OR]  
    RewriteRule ^/(.*) http://other.host.com/moo?p=1&s=2&targetURL=http://bar.com/more/query/$1 [R=301,L]
  </IfModule>

答案 1 :(得分:1)

试试这个:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^my\.host\.com [NC]
RewriteCond %{QUERY_STRING} ^(.*)targetURL=http://foo.com/sub/(.*)$ 
RewriteRule ^/?moo$ http://other.host.com/moo?%1targetURL=http://bar.com/%2 [L,R=301]

您需要使用targetURL=http://foo.com/sub/匹配%{QUERY_STRING}变量中的RewriteCond部分。当RewriteRule与其匹配时,查询字符串不是URI的一部分。然后,您可以使用%1%2反向引用来引用查询字符串中匹配的分组。