0

我们发现某些电子邮件提供商的客户将分号替换为 %3b,因此我们发送给他们的 URL 变为

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)以及如何实现目标的帮助将不胜感激。谢谢。

4

1 回答 1

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 .

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

同样使用通配符“.*”来捕获 RewriteRule 中的 URL 并不理想,但我发现没有办法让 RewriteRule 识别来自 %1 等的模式,因此建议仅在您已确保的情况下使用此方法你的 RewriteCond 将防止无意的行为。

希望这对其他人有帮助。

于 2013-07-03T16:46:01.607 回答