【问题标题】:replacing all occurences of %3b in URL替换 URL 中所有出现的 %3b
【发布时间】:2013-06-24 18:09:33
【问题描述】:

我们发现某些电子邮件提供商的客户将分号替换为 %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)以及如何实现目标的帮助将不胜感激。谢谢。

【问题讨论】:

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


    【解决方案1】:

    经过反复试验,我解决了这个问题。下面是重写条件和规则。

    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 将防止无意的行为。

    希望这对其他人有帮助。

    【讨论】:

      猜你喜欢
      • 2018-06-28
      • 1970-01-01
      • 2018-04-15
      • 2018-04-05
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多