如何通过mod_rewrite重命名HTTP GET参数以兼容旧链接?
解决NextCloud旧链接兼容的mod_rewrite二次转义问题
核心解决方案:添加NE(NoEscape)标志
修改原规则,加入NE标志即可阻止已转义字符被二次转义:
RewriteCond %{QUERY_STRING} (^|&)path=([^&]+)(&|$) RewriteRule ^/index\.php/s/public$ /index.php/s/public?dir=%2 [L,R=301,NE]
为什么这个方案有效?
Apache mod_rewrite默认会对重写目标中的特殊字符(比如%)自动转义,导致原链接里的%2F被再次转义为%252F。NE(NoEscape)标志的作用就是禁用这种自动转义,让原始的URL编码字符保持原样。
进阶:保留其他查询参数
如果旧链接可能包含path以外的其他查询参数(比如?path=/Path/To/Folder&foo=bar),可以使用更通用的规则,替换path为dir的同时保留其他参数:
RewriteCond %{QUERY_STRING} ^(.*&)?path=([^&]+)(&.*)?$ RewriteRule ^/index\.php/s/public$ /index.php/s/public?%1dir=%2%3 [L,R=301,NE]
这个规则会匹配path参数在任意位置的情况,替换后保留所有其他参数,同时避免二次转义。
内容的提问来源于stack exchange,提问作者radeczek
相关产品推荐
相关产品推荐

