使用RewriteMap与RewriteRules重定向盗链PDF文件失败求助
修复PDF盗链重定向问题
核心问题分析
你的配置存在几个关键问题,导致重定向未生效:
- 映射键匹配不兼容:
pdf-mapping.txt里的键是带前置斜杠的完整路径(比如/stakeholder-register.pdf),但.htaccess中RewriteRule匹配的$1是相对路径(无前置斜杠),导致映射查找失败。 - REFERER规则限制过严:当用户直接在地址栏输入PDF URL时,
HTTP_REFERER为空,会被第一条RewriteCond排除,无法触发重定向。 - 编码路径不匹配:
pdf-mapping.txt里的Exception%20Report.pdf是URL编码后的路径,但Apache实际接收的是解码后的Exception Report.pdf,导致映射失效。
分步修复方案
1. 调整映射文件格式
修改/home/stakehol/public_html/pdf-mapping.txt,去掉键的前置斜杠,同时使用解码后的真实文件名(用空格代替%20):
stakeholder-register.pdf /stakeholder-register.html project-templates/lessons-learned-template.pdf /project-templates/lessons-learned-template.html project-templates/Exception Report.pdf /project-templates/prince-2-exception-report.html
2. 更新 .htaccess 规则
替换现有规则,确保映射匹配逻辑正确,同时按需调整盗链拦截范围:
RewriteEngine On # 拦截非本站来源的PDF请求(如需禁止直接访问,删除下方第一条规则) RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?stakeholdermap.com [NC] # 检查当前请求的PDF路径在映射表中存在 RewriteCond ${pdf-mapping:%REQUEST_URI} !^$ # 重定向到对应HTML页面 RewriteRule ^.*\.pdf$ https://www.stakeholdermap.com/${pdf-mapping:%REQUEST_URI} [R=302,L]
- 使用
%REQUEST_URI代替$1,它是包含前置斜杠的完整请求路径,能精准匹配映射表中的键。 - 若要拦截所有非本站发起的请求(包括直接访问),删除
RewriteCond %{HTTP_REFERER} !^$这条规则;若需允许用户直接输入URL访问PDF,则保留该规则。
3. 确保文件权限合法
让Apache进程能够读取映射文件:
chmod 644 /home/stakehol/public_html/pdf-mapping.txt chown stakehol:www-data /home/stakehol/public_html/pdf-mapping.txt
(用户组根据服务器实际配置调整,比如部分服务器用apache代替www-data)
4. 测试重定向效果
用curl模拟外部盗链请求验证:
curl -I -H "Referer: https://example.com" https://www.stakeholdermap.com/stakeholder-register.pdf
若返回302 Found且Location字段指向对应HTML页面,说明配置生效。
批量管理建议
后续添加数百条URL时,可编写脚本批量生成映射文件:遍历PDF文件目录,自动生成对应HTML路径(大部分场景下PDF与HTML仅后缀不同,特殊路径单独调整),避免手动输入错误。
内容的提问来源于stack exchange,提问作者projectmonkey
相关产品推荐
相关产品推荐

