我从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]
我很感激帮助。
答案 0 :(得分:0)
尝试使用带有RewriteCond
和NEXT
标记的'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堆栈上相同问题的回答: