如何通过.htaccess正则为下载PDF文件添加路径名前缀?
实现PDF下载时自动添加文件夹前缀的.htaccess配置方案
要实现下载时自动给PDF文件名添加所在文件夹层级作为前缀,你可以通过Apache的mod_rewrite和mod_headers模块配合正则表达式来完成。下面分两种常见场景给出具体配置:
场景1:添加所有父文件夹层级作为前缀
比如01-science/lesson-1/notes.pdf下载后变为01-science_lesson-1_notes.pdf,配置如下:
RewriteEngine On # 第一步:提取完整路径和文件名,存入环境变量 RewriteRule ^(.+/)([^/]+)\.pdf$ - [E=DOWNLOAD_FILENAME:%1%2.pdf] # 第二步:循环替换路径中的斜杠为下划线(处理多层文件夹) RewriteCond %{ENV:DOWNLOAD_FILENAME} ^(.+)/(.+)\.pdf$ RewriteRule ^ - [E=DOWNLOAD_FILENAME:%1_%2.pdf] RewriteCond %{ENV:DOWNLOAD_FILENAME} ^(.+)/(.+)\.pdf$ RewriteRule ^ - [E=DOWNLOAD_FILENAME:%1_%2.pdf] # 第三步:强制下载并设置修改后的文件名 Header set Content-Disposition "attachment; filename=\"%{DOWNLOAD_FILENAME}e\"" env=DOWNLOAD_FILENAME
关键正则解释:
第一个
RewriteRule的正则^(.+/)([^/]+)\.pdf$:^(.+/):捕获从URL开头到最后一个斜杠的所有内容(即所有父文件夹路径,比如01-science/lesson-1/)([^/]+)\.pdf$:捕获PDF文件名(不含路径,比如notes)- 两者组合后存入环境变量
DOWNLOAD_FILENAME,初始值为01-science/lesson-1/notes.pdf
替换斜杠的正则
^(.+)/(.+)\.pdf$:- 匹配仍包含斜杠的文件名,将斜杠前后的内容分成两组
- 通过
%1_%2.pdf将斜杠替换为下划线,重复执行直到路径中无斜杠
场景2:仅添加最后一级文件夹作为前缀
如果你只需要最后一层文件夹作为前缀(比如lesson-1_notes.pdf),可以简化配置:
RewriteEngine On # 提取最后一级文件夹和文件名 RewriteRule ^.+/([^/]+)/([^/]+)\.pdf$ - [E=DOWNLOAD_FILENAME:%1_%2.pdf] # 强制下载并设置文件名 Header set Content-Disposition "attachment; filename=\"%{DOWNLOAD_FILENAME}e\"" env=DOWNLOAD_FILENAME
关键正则解释:
^.+/([^/]+)/([^/]+)\.pdf$:^.+:忽略前面所有层级的文件夹路径([^/]+)/:捕获最后一级文件夹名称(比如lesson-1)([^/]+)\.pdf$:捕获PDF文件名(比如notes)- 直接组合成带前缀的文件名存入环境变量
注意事项:
- 确保你的Apache服务器已经启用了
mod_rewrite和mod_headers模块 - 如果文件名或文件夹名包含特殊字符(如空格、非ASCII字符),可能需要额外处理URL编码
- 可以根据需求修改分隔符(比如把下划线
_换成横杠-或其他符号)
内容的提问来源于stack exchange,提问作者bmrs
相关产品推荐
相关产品推荐

