在 apache 中配置 rewriterule 忽略 pathinfo 进行精确匹配,核心做法是在规则末尾添加 [dpi] 标志。该标志会清除由 mod_rewrite 处理过程中自动附加的 pathinfo,确保后续模块(如 mod_cgi)接收到的 uri 路径是重写后的精确路径,而非包含额外参数的原始路径。
![Apache 中 RewriteRule 怎么配置 [DPI] 忽略 PathInfo 进行精确匹配](https://img.php.cn/upload/article/001/242/473/179477823834497.png?x-oss-process=image/resize,p_40)
RewriteRule 默认如何处理 PathInfo
当 URL 请求中包含不属于当前文件名的多余路径段时,Apache 默认将其识别为 PathInfo。如果未使用 [DPI],mod_rewrite 在重写后会将这些 PathInfo 重新附加到新的 URI 上,导致目标脚本接收到意外的参数。
![Apache 中 RewriteRule 怎么配置 [DPI] 忽略 PathInfo 进行精确匹配](https://img.php.cn/upload/article/001/242/473/179477823836796.png?x-oss-process=image/resize,p_40)
LoadModule rewrite_module modules/mod_rewrite.so
<virtualhost>
ServerName example.com
DocumentRoot /var/www/html
<directory>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</directory>
RewriteEngine On
# 示例:将 /api/v1/users 重写为 /index.php
RewriteRule ^/api/v1/(.*)$ /index.php [L,DPI]
</virtualhost>
上述配置中,访问 /api/v1/users 会被重写为 /index.php。若没有 [DPI],PathInfo /users 可能会被保留并附加到 /index.php 后,导致 $_SERVER['PATH_INFO'] 不为空。添加 [DPI] 后,PathInfo 被丢弃,/index.php 作为精确路径传递给后端。
如何验证 PathInfo 是否被正确忽略
通过创建一个简单的 PHP 脚本来检查 $_SERVER['PATH_INFO'] 的值,可以验证 [DPI] 的效果。如果值为空字符串或 null,说明 PathInfo 已被成功忽略;否则,说明 PathInfo 仍被传递。
通过Apache Tika Server REST API从1400多种文件格式中提取文本和元数据。处理PDF、DOCX、PPTX、电子邮件归档以及带有MIME类型检测的嵌入式文档提取。
![Apache 中 RewriteRule 怎么配置 [DPI] 忽略 PathInfo 进行精确匹配](https://img.php.cn/upload/article/001/242/473/179477823846032.png?x-oss-process=image/resize,p_40)
<?php // info.php
header('Content-Type: text/plain');
echo 'REQUEST_URI: ' . $_SERVER['REQUEST_URI'] . "\n";
echo 'SCRIPT_NAME: ' . $_SERVER['SCRIPT_NAME'] . "\n";
echo 'PATH_INFO: ' . var_export($_SERVER['PATH_INFO'], true) . "\n";
?>
访问 /info.php/some/path 时,若 RewriteRule 使用了 [DPI],则 PATH_INFO 应为空。这确保了后端逻辑只基于 SCRIPT_NAME 进行处理,避免了因 PathInfo 导致的意外行为。
基于 /api/v1/users 输入的具体问题
当输入为 /api/v1/users 且目标是 /index.php 时,[DPI] 确保 /users 不会成为 PathInfo。这是精确匹配的关键,因为许多框架依赖路由前缀而非 PathInfo 来解析请求。









