mod_rewrite RewriteRule用于处理HTML实体

时间:2010-07-12 14:19:55

标签: apache mod-rewrite

出于某种原因,我们在包含HTML实体的网址上收到大量入站流量。

E.g。

http://www.ourdomain.com/index.php?key1=value1&key2=value2

我想创建一个RewriteRule来替换这些HTML实体(特别是& amp;和&),并将人们转发到更正后的地址。

我试过这些:

RewriteRule & & [R=permanent]

RewriteRule & &

但没有发生任何事情。

(顺便说一句。我知道这是解决别人问题的一种可怕而危险的方法,但我只需要暂时完成它。)

感谢您的帮助......

2 个答案:

答案 0 :(得分:4)

这应该可以解决问题;

RewriteEngine On
RewriteCond %{QUERY_STRING} (.*)&(.*)
RewriteRule .* /index.php?%1&%2 [N,R=301]

这基本上是说;

  • 查询字符串中是否有&
  • 如果是,请匹配前后的所有内容,然后将其与&
  • 夹在一起
  • 规则中的N标志有效地说'继续这样做直到条件不再匹配'

查看mod_rewrite documentation,包括RewriteCondrule flags

答案 1 :(得分:0)

对于任何重写工作,重写引擎必须打开,但也许你已经修复了:

# following statement must come before any other rewrite statements
# and must be enabled per virtual host configuration
RewriteEngine On
<&amp;&符号是一种特殊的元字符。显然,已复制并粘贴链接的人在编辑器内进行了编辑,该编辑器最终将&符号转换为&amp;(或者,技术上更正确,&amp;amp;如果它发生在a-tag内)。我不是百分百肯定,但我发现它可能会被转义,试试这个:

RewriteRule \&amp; \&

要了解重写的方式,重写的内容以及原因,您应该重写日志(确保Apache可以写入RewriteLog的位置):

RewriteLog "somepath.log"
RewriteLogLevel 3

其中9级是最高的。