Apache2 RewriteRule调试:如何捕获重写结果输出到响应头?
问题根因分析
return (<Location>块内RewriteRule匹配规则错误:<Location>标签指定了路径前缀`/subfold/dl`后,块内的RewriteRule匹配的是去掉该前缀后的相对路径,你原规则匹配`^subfold/dl/`开头的完整路径,永远无法命中,所以`ENV=RSLT:AAA`的赋值逻辑从未执行,这是X-RSLT返回(null)的核心原因。 )- 非2xx响应的环境变量前缀问题:即使RewriteRule命中,Apache处理非成功响应(比如你这里的404)时,会给mod_rewrite设置的自定义环境变量自动添加
REDIRECT_前缀,直接取%{RSLT}e会找不到变量。
修复方案
修改后的配置如下:
<Location /subfold/dl> RewriteEngine On RewriteCond %{REQUEST_URI} ^/subfold/dl/ # 匹配去掉/subfold/dl/前缀后的相对路径,直接把重写结果存入环境变量 RewriteRule ^(.*)/(.*)$ httpdocs__$1__$2 [ENV=RSLT:httpdocs__$1__$2,NE] SetEnvIf Request_URI "^/subfold/dl/" REWRGO=Yes # 优先适配404场景下带REDIRECT_前缀的变量,不存在再取原始变量 Header always set X-REWRGO "%{REWRGO}e" Header always set X-RSLT "%{REDIRECT_RSLT}e" env=REDIRECT_RSLT Header always set X-RSLT "%{RSLT}e" env=RSLT </Location>
重写过程调试补充
- rewrite:trace8级别日志中已经包含完整的执行过程:搜索日志中包含
rewrite '的行,即可看到每次重写的输入路径和输出结果;搜索applying pattern可以查看规则匹配顺序,cond %{REQUEST_URI}开头的行可以查看RewriteCond的匹配结果。 - 按上述配置修改后,直接执行
curl -IkL http://127.0.0.1/subfold/dl/my/test.html即可在响应头中看到X-RSLT返回httpdocs__my__test.html。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

