apache默认记录原始请求路径,要记录重写后的目标路径,需用rewriterule设置环境变量(如[e=target_path:/article.php?id=$1]),再通过logformat "%{target_path}e"写入日志;或直接用%{request_filename}e获取实际处理的文件路径。

Apache 默认访问日志记录的是客户端发起的原始请求路径(%r 中的 REQUEST_URI),而不是经过 RewriteRule 内部重写后实际处理的目标路径。要记录“重写后的最终目标 URL 路径”,需借助 %{THE_REQUEST}e、%{REQUEST_FILENAME}e 或自定义环境变量等机制,在重写过程中显式捕获并输出到日志。
用环境变量在重写时标记目标路径
这是最可靠、兼容性最好的方式:在 RewriteRule 执行时,用 env= 标志设置一个环境变量,保存你关心的最终目标路径(如映射后的脚本路径或内部 URI)。
- 在
.htaccess或虚拟主机配置中添加规则示例:
RewriteEngine On<br>RewriteRule ^article/([0-9]+)\.html$ /article.php?id=$1 [E=TARGET_PATH:/article.php?id=$1,L]
-
[E=TARGET_PATH:...]将重写目标存入环境变量TARGET_PATH -
L确保后续规则不干扰该值
扩展 LogFormat,记录环境变量值
在 httpd.conf 或 apache2.conf 的日志模块配置区(<ifmodule log_config_module></ifmodule>)中,定义新日志格式:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{TARGET_PATH}e\"" rewrite_target
-
%{TARGET_PATH}e表示读取名为TARGET_PATH的环境变量值 - 若重写未命中或未设该变量,则此项留空
- 启用该格式:
CustomLog "/var/log/apache2/access.log" rewrite_target
替代方案:记录实际处理的文件系统路径
如果目标是知道 Apache 最终执行哪个物理文件(例如 /var/www/html/article.php),可用 %{REQUEST_FILENAME}e —— 它在重写完成后解析为真实存在的文件或目录路径:
- 无需额外设置环境变量,直接在 LogFormat 中使用:
%{REQUEST_FILENAME}e - 注意:若重写结果是 CGI、PHP-FPM 或代理(
[P]),该值可能为空或不准确 - 适合静态映射或
mod_php直接执行场景
验证与调试建议
重写日志本身不输出目标路径,但可用于确认规则是否触发及匹配过程:
- Apache 2.4+:临时加
LogLevel alert rewrite:trace3到虚拟主机或主配置 - 查看
error_log,搜索rewrite关键字,确认[E=...]是否生效 - 用
curl -I http://yoursite/article/123.html检查响应头和日志条目是否同步更新









