用%2526替换htaccess中的%26

时间:2010-10-22 20:49:08

标签: apache drupal .htaccess mod-rewrite

我从Mediawiki导入了一堆标题中有&符号的页面。这些编码为%26。由于各种原因,Drupal决定对URL进行双重编码,使其成为%2526。我根本无法在Drupal中创建alaises所以我必须使用htaccess。

我需要example.com/something_%26_else成为example.com/something_%2526_else。到目前为止,这就是我的规则:

RewriteRule ^w/([^%26]+)\%26(.*)$ w/$1\%2526$2 [R=301]

我很感激帮助。

2 个答案:

答案 0 :(得分:0)

尝试使用带有RewriteCondNEXT标记的'look-behind'机制循环URI,将%26更改为%2526:

RewriteCond "\%(?<=25)26"
RewriteRule "^(w/.*)\%(?<=25)(26.*)" "$1\%25$2" [N]

答案 1 :(得分:0)

要将/<something>%26<something>请求重定向到/<something>%2526<something>,则可以使用mod_rewrite执行以下操作:

RewriteRule (.+)&(.+) /$1\%26$2 [R,L]

RewriteRule 模式与%解码的URL路径(即&,而不是%26)匹配。因此,您应该直接按字面意义指定&(“&”号)。请注意,这将同时满足/something_%26_else/something_&_else的请求(因为&不需要在请求中进行编码)。

% 中的RewriteRule(百分比)需要反斜杠转义以表示文字%,否则将是被视为对最后匹配的 CondPattern 的反向引用,并且没有任何内容,因此%2否则将成为空字符串!

默认情况下,mod_rewrite自动对替换URL进行编码,这实际上是我们在这种情况下想要的:%26被(双重)编码为%2526


如果您特别需要循环构造,例如%26可以在请求的URL中多次出现,那么您可以执行以下操作:

# 1. Looping construct to replace all "&" (decoded %26)
RewriteRule (.+)&(.+) $1\%26$2 [N,E=REPLACED:yes]

# 2. Finally redirect. Substitution is only URL-encoded at this stage.
RewriteCond %{ENV:REPLACED} yes
RewriteRule (.*) /$1 [R,L]

有关更多说明和替代方法,另请参阅我对Pro Webmasters堆栈上相同问题的回答: