我正在处理来自专有客户的请求,有时使用反斜杠而不是正斜杠:GET /path\to\the\file.txt
,我想将它们全部理顺。
mod_rewrite 可以一次替换一个:
RewriteRule ^(.*)\\+(.*) $1/$2 [QSA]
但我该如何替换全部像 sed 的修饰符那样一次性发生这种情况/g
?
更新,根据标志 [N] 文档友情链接:@esa-jokinen,下面的简单规则应该“有效”:
RewriteRule "(.*)\\+(.*)" "$1/$2" [N,QSA]
但事实并非如此——%{REQUEST_URI}
仍然有反斜杠(甚至没有替换第一个和最后一个)。
我尝试添加noescape
旗帜也是:[NE,N,QSA]
,但是那没有帮助......
我知道,匹配是有效的,因为如果我将 R=301 添加到标志中,我确实会向客户端发送正确的重定向,并且所有反斜杠都会被正确更改。但我不想依赖客户端处理重定向的能力——然而,在内部,%{REQUEST_URI} 保持不变,所有反斜杠都完好无损……
我的 Apache 版本是 2.4.6 —— 这是我们正在使用的 RedHat 为 RHEL7 提供的最新版本。
答案1
应该可以实现如下功能:
RewriteRule ^/([^\\]*)\\([^\\]*\\.*) /$1/$2 [N]
RewriteRule ^/([^\\]*)\\([^\\]*)$ /$1/$2
https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_n
[N] 标志使规则集从头开始,使用迄今为止的规则集结果作为起点。请谨慎使用,因为它可能会导致循环。