[PT]标志使mod_rewrite重写结果退出重写流程,交还给主请求处理流程,从而触发Apache重新执行URL-to-filename映射,使Alias指令得以匹配;若省略[PT],重写结果将被直接当作文件路径处理而跳过Alias。
在虚拟主机环境中,mod_rewrite 的 [pt](pass through)标志不能真正“链式处理” alias 指令——因为 alias 是在 url 到文件系统路径映射的早期阶段(per-server 或 per-dir 配置解析期)就完成的,而 mod_rewrite 默认运行在 url 重写阶段(较晚),其重写结果若不显式移交控制权,就不会触发后续的别名解析。
但你可以通过 [PT] 让 rewrite 结果“退出重写流程”,交还给主请求处理流程,从而让 Apache 再次尝试匹配 Alias、ScriptAlias 等路径映射指令。这并非严格意义上的“链式处理”,而是利用 Apache 请求生命周期中的两次路径解析机会。
为什么需要 [PT]?
mod_rewrite 默认将重写后的 URL 当作内部子请求处理,绕过后续的别名查找;[PT] 告诉 Apache:“请把这个重写结果当作原始请求 URI 一样,重新走一遍 URL-to-filename 映射流程”。只有这时,Alias /foo /var/www/bar 才有机会匹配上被重写为 /foo/xxx 的 URI。
注意:[PT] 在 .htaccess 中可用,但要求 RewriteEngine On 且所在目录允许 FollowSymLinks 或 SymLinksIfOwnerMatch(取决于 AllowOverride 设置)。
典型配置示例
假设你希望访问 /legacy/script.php?x=1 实际映射到 /new/app/index.php,且该新路径已用 Alias 定义:
# 在虚拟主机配置或 httpd.conf 中(推荐)
Alias /new /var/www/html/new-app
<Directory "/var/www/html/new-app">
Require all granted
</Directory>
<h1>在 .htaccess 中(若虚拟主机允许)</h1><p>RewriteEngine On
RewriteCond %{REQUEST_URI} ^/legacy/
RewriteRule ^legacy/(.*)$ /new/$1 [PT]</p>关键点:
- 重写目标必须以
/开头(绝对路径),否则[PT]不生效; - 目标路径
/new/...必须与Alias指令前缀一致; - Apache 会在应用
[PT]后,用新 URI/new/...重新执行别名查找,命中Alias /new ...; - 如果省略
[PT],rewrite 结果会被当作文件系统路径直接尝试打开,跳过Alias。
常见陷阱与验证方法
若配置无效,优先检查:
-
错误日志:开启
RewriteLogLevel 3(Apache 2.2)或使用LogLevel alert rewrite:trace3(2.4+),确认是否命中规则、是否应用了[PT]; -
Alias 作用域:
Alias必须在 server/vhost 级定义,.htaccess中无法声明Alias; -
权限覆盖:确保
<Directory>块允许该路径被访问,且未被更外层Deny覆盖; -
多级重写干扰:避免其他
RewriteRule在同一上下文中提前终止流程(如误加[L]却没配[PT])。
替代方案(当 [PT] 不可用时)
某些共享虚拟主机禁用 [PT](出于安全限制)。此时可考虑:
- 用
RewriteRule直接指向真实文件路径(如/var/www/html/new-app/index.php),并加[L]; - 改用
RedirectMatch做外部跳转(用户可见 URL 变化); - 联系主机商启用
mod_alias和mod_rewrite协同支持,或升级至支持ProxyPassMatch的环境(需mod_proxy)。

















