替换URL中所有出现的%3b

时间:2013-06-27 09:42:35

标签: .htaccess mod-rewrite url-rewriting apache2

我们发现拥有某些电子邮件提供商的客户将半冒号替换为%3b,因此我们发送给他们的网址变为

http://www.mytestsite.com/connect/vehicles/?rm=view_results%3bmake=BMW%3bmodel=3%20SERIES%3bvehicle_type_desc=Car

但它必须是

http://www.mytestsite.com/connect/vehicles/?rm=view_results;make=BMW;model=3%20SERIES;vehicle_type_desc=Car

我已经尝试过httpd.conf和.htaccess文件中的任意数量的配置来解决这个问题而没有成功。我选择使用.htacces文件,以下是我在该文件中的一些尝试。

RewriteCond %{QUERY_STRING} ^[A-Z]+\ /([^?\ ]*)%253b([^?\ ]*)
RewriteRule ^ %1;%2 [R=301,NE,NC,L]
RewriteRule (.*)\%3b(.*)\%3b(.*)\%3b(.*) $1;$2;$3;$4 [R=301,L]

另外

RewriteCond %{QUERY_STRING} (.*)(%3b)(.*)
RewriteRule ^%3b %1;%2? [R=301,L,NC,NE

任何帮助详细说明最适合使用哪个文件(httpd.conf或.htaccess)以及如何实现目标都将非常感激。感谢。

1 个答案:

答案 0 :(得分:2)

我经过一些试验和错误后解决了这个问题。以下是重写条件和规则。

RewriteCond %{QUERY_STRING} ^([^.]+view_results)%3b([^.]+)%3b([^.]+)%3b([^.]+)$ [NC]
RewriteRule .* http://www.mytestsite.com/connect/vehicles/?rm=view_results;%2;%3;%4 [R=301,L,NC,NE]

从这个解决方案中,我承认最初的问题是错误的构思,可能这就是我在这里没有得到帮助的原因。问题应该是“如何通过替换%3b来重定向此URL?”

解释解决方案:

RewriteCond获得QUERY_STRING中用3%3bs点缀的所有内容。当然,从正则表达式中,我们可以看到我们没有捕获有问题的字符,因为我们将随后替换它们,并且我们使这个捕获不区分大小写([NC])。

RewriteRule接受整个URL中的所有内容并将其替换为正确的模式,将捕获插入为%2等。如果我们只对一种URL模式感兴趣并且打算使用%1,那么我们不需要%1无论如何都要改写它。

需要注意的是,如果RewriteCond没有文字字符串“view_results”,那么它会捕获任何具有此模式的URL以及我们系统构建的某些CGI请求与此模式匹配。

同样地使用通配符“。*”来捕获RewriteRule中的URL并不理想,但我发现无法使RewriteRule识别来自%1等的模式,所以建议只使用此方法你确保你的RewriteCond可以防止无意中的行为。

希望这有助于其他人。