如何通过.htaccess隐藏PDF文件内下载链接的真实URL路径
解决方案
方案1:极简路径展示(悬停仅显示https://msia.com/)
如果要求鼠标悬停时完全不暴露任何额外路径、参数,直接显示根域名,用会话缓存绑定的方式实现:
- 先修改PHP生成PDF链接的逻辑,同时把订单ID和当前访问者的标识绑定存入缓存:
// 生成用户唯一标识,也可以用WP自带的用户session逻辑 $user_sign = md5($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']); // 缓存有效期设为24小时,用Redis、APCu、文件缓存都可以 apcu_store('pdf_order_' . $user_sign, $order_id, 86400); // href直接填根域名,悬停只会显示你需要的https://msia.com/ $url = '<a href="https://msia.com/"><b>Download PDF</b></a>';
- 在站点根目录的index.php最顶部加校验逻辑,匹配到PDF下载请求就内部转发到处理脚本,不跳转:
// index.php 开头插入 $user_sign = md5($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']); $cached_order_id = apcu_fetch('pdf_order_' . $user_sign); if ($cached_order_id) { // 用完就删缓存,避免重复请求冲突 apcu_delete('pdf_order_' . $user_sign); $_GET['key'] = $cached_order_id; require __DIR__ . '/wp-content/themes/astra-child/pdf.php'; exit; } // 原有首页逻辑保留
方案2:路径带订单ID(悬停显示https://msia.com/[ID])
如果可以接受展示订单ID,直接用URL重写实现更简单,不需要改首页逻辑:
- 修改PHP生成链接的逻辑:
$url = '<a href="https://msia.com/' . $order_id . '"><b>Download PDF</b></a>';
- 把根目录的.htaccess规则替换成下面的内容,你之前写的规则匹配逻辑是错的,RewriteRule只匹配域名后的路径部分:
RewriteEngine On RewriteBase / # 内部转发纯数字路径到PDF处理脚本,不会触发浏览器跳转 RewriteRule ^([0-9]+)$ /wp-content/themes/astra-child/pdf.php?key=$1 [L,NC]
额外说明
- JS方案完全不可行,PDF阅读器不支持执行JavaScript,也不会解析DOM相关的样式修改,不需要再尝试这个方向
- 两种方案都是内部转发,用户点击链接后地址栏也不会暴露真实的处理脚本路径,完全符合隐藏需求
- 如果担心订单ID被恶意遍历,可以额外加签名校验:生成链接时拼接签名参数,在pdf.php里校验签名合法性即可。
内容的提问来源于stack exchange,提问作者TobitheDev
相关产品推荐
相关产品推荐

