apache默认access_log不记录重定向前的原始url,需通过setenvif或rewriterule将原始uri存为环境变量,并在customlog中用%{varname}e引用;推荐使用%{the_request}e记录完整原始请求行。

Apache 默认的 access_log 记录的是最终响应的请求路径,不是跳转前的原始 URL。要记录重定向前的原始请求信息,必须主动把原始路径或参数“带入”日志,不能依赖默认行为。
用环境变量捕获原始请求 URI
在重定向发生前,用 RewriteRule 或 SetEnvIf 把原始请求信息存为环境变量,再在日志格式中引用:
- 对所有请求统一记录原始 URI:
SetEnvIf Request_URI "(.*)" ORIGINAL_URI=$1
CustomLog "/var/log/apache2/access.log" "%h %t \"%r\" %>s %b \"%{ORIGINAL_URI}e\"" - 只在重定向规则中记录(更精准):
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/old/.*$
RewriteRule ^(.*)$ /new/$1 [E=REDIR_FROM:%{REQUEST_URI},R=301,L]
CustomLog "/var/log/apache2/redirect.log" "%h %t \"%r\" %>s \"%{REDIR_FROM}e\" -> \"%{REQUEST_URI}e"
记录带参数的完整原始请求
如果跳转涉及 QueryString(如 ?ref=abc),需额外捕获 %{QUERY_STRING}e 或拼接完整原始 URL:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 用
%{THE_REQUEST}记录原始 HTTP 行(含方法、路径、协议、参数):
LogFormat "%h %t \"%{THE_REQUEST}e\" %>s \"%{REQUEST_URI}e\"" full_request
CustomLog "/var/log/apache2/full.log" full_request
示例日志:"GET /old/page?x=1 HTTP/1.1" 301 "/old/page" - 手动拼接原始地址(适合 Rewrite 场景):
RewriteCond %{QUERY_STRING} (.+)
RewriteRule ^/old/(.*)$ /new/$1?%1 [E=ORIG_REQ:/old/$1?%1,R=301,L]
避免日志中出现空值或重复
环境变量只在匹配条件时设置,未触发规则就为空。建议:
- 用
%{VARNAME}e而非%{VARNAME}i,前者读环境变量,后者读请求头,易混淆 - 若同时使用多个重定向逻辑(如域名跳转 + 路径跳转),给环境变量起唯一名,如
ORIG_HOST、ORIG_PATH - 测试时用
curl -I http://example.com/old查看响应头是否含Location,再查对应日志行是否含原始字段
不复杂但容易忽略:原始请求信息不会自动进日志,必须显式提取并绑定到日志格式里。










