t标志用于强制指定响应content-type头,不改变文件内容,适用于动态内容、无后缀资源等场景;需搭配pt、l等标志确保生效,且不替代后端header设置。

Apache mod_rewrite 的 T 标志(即 T=MIME-type)用于在重写过程中**强制指定响应内容的 MIME 类型**,它不改变文件本身,而是覆盖服务器原本根据扩展名或内容自动判断出的 Content-Type 响应头。这在处理动态生成内容、无后缀资源或需要绕过默认类型映射时特别有用。
什么时候需要用 T 标志
当你希望某个 URL 路径(无论真实文件是否存在或后缀如何)被浏览器以特定方式解析时,比如:
- 把
/api/data当作 JSON 返回(application/json),即使它背后是 PHP 脚本 - 让一个无扩展名的脚本(如
/cgi-bin/counter)被当作 CGI 执行(application/x-httpd-cgi) - 将纯文本模板(如
/templates/main)强制设为text/plain,避免被误当 HTML 渲染
T 标志的基本用法
语法为:[T=xxx/yyy],必须和 RewriteRule 搭配使用,写在方括号内作为 flag:
RewriteRule ^/json-api/(.*)$ /internal/handler.php?path= [T=application/json]
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
这条规则表示:所有匹配 /json-api/xxx 的请求,都会被重写到 handler.php,但响应头中的 Content-Type 将强制设为 application/json,不管 PHP 脚本自己是否设置了 header。
关键注意事项
- T 不影响实际输出内容:它只改响应头,不转换数据格式。你仍需确保后端输出合法的 JSON、XML 等内容
-
不能替代 Content-Type 输出逻辑:如果 PHP 或 CGI 脚本自己调用了
header("Content-Type: text/html"),它会覆盖 T 设置(因响应头已发出),此时应在脚本中移除或统一由 rewrite 控制 - 仅对成功匹配并执行的规则生效:若规则带 L(last)且提前终止,T 才能稳定作用;否则后续规则可能干扰
-
常见 MIME 类型示例:
text/css、application/javascript、image/svg+xml、application/x-httpd-cgi
配合其他标志提升可靠性
单独用 T 往往不够,常搭配以下 flag 使用:
- PT(Pass Through):当重写目标需交由其他处理器(如 mod_cgi、mod_php)处理时,加 PT 可确保 Apache 正确识别 handler,再应用 T
- L(Last):防止后续规则意外覆盖 MIME 类型设置
- NS(No Sub-request):避免内部子请求(如 include、ErrorDocument)误触发 T 规则
典型组合:[T=application/json,PT,L]










