如何通过htaccess或PHP实现旧PDF链接通配符重定向至最匹配新版本
实现方案说明
方案1:.htaccess 通配符规则(不推荐)
Apache的mod_rewrite仅支持固定模式的重定向,不具备动态扫描文件、比对版本号的能力。如果用该方案,每次更新版本都需要手动在.htaccess中新增旧版本号跳转到新版本号的规则,维护成本极高,完全不适合版本更新频繁的场景。
方案2:PHP 动态跳转脚本(推荐)
该方案可以自动匹配同型号的最新版本文件,无需每次更新版本手动修改规则,实现成本低、维护方便。
实现步骤
- 配置根目录下的
.htaccess规则,将/files/目录下不存在的PDF请求转发到处理脚本:
RewriteEngine On # 仅拦截不存在的PDF文件请求 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^files/([A-Z0-9]+)-[^_]+_(.*)\.pdf$ /pdf_redirect.php?model=$1&filename=$2 [L,QSA]
- 新建根目录下的
pdf_redirect.php处理脚本,代码示例如下:
<?php // 基础配置 $fileStoragePath = __DIR__ . '/files/'; $fileAccessBaseUrl = 'https://example.com/files/'; // 过滤参数,避免路径遍历风险 $model = preg_replace('/[^A-Z0-9]/', '', $_GET['model'] ?? ''); $filename = preg_replace('/[^A-Za-z0-9_]/', '', $_GET['filename'] ?? ''); if (empty($model) || empty($filename)) { http_response_code(404); exit('请求的文件不存在'); } // 匹配对应型号的所有目标PDF文件 $matchPattern = $fileStoragePath . $model . '-*_' . $filename . '.pdf'; $matchedFiles = glob($matchPattern); if (empty($matchedFiles)) { http_response_code(404); exit('请求的文件不存在'); } // 按版本号自然排序,取最新版本 natsort($matchedFiles); $latestFileName = basename(end($matchedFiles)); // 执行重定向,如需永久缓存可将302改为301 header('Location: ' . $fileAccessBaseUrl . $latestFileName, true, 302); exit;
优化建议
如果站点文件量较大、访问量较高,可新增缓存机制:将型号与对应最新版本文件的映射关系存储在缓存文件/数据库中,每次更新版本时主动更新映射关系,避免每次请求都扫描目录,提升响应效率。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

