Apache URL重写不解析短链,而是将/s/abc123等请求内部重写至index.php?short=abc123,由PHP完成查库、鉴权、统计与302跳转;须启用mod_rewrite、排除真实文件目录、保留查询参数,并配合防盗链、防爆破及HTTPS强制等安全措施。

Apache 中 URL 重写本身不“解析”短链,而是把形如 /s/abc123 这样的请求,按规则转发给后端 PHP(或其它脚本)处理——真正的跳转逻辑、密码校验、访问统计、链接查库等,全由那个 PHP 文件完成。网盘类短链系统依赖的是「重写 + 后端路由」配合,不是纯靠 .htaccess 跳走。
核心思路:把短链请求代理给统一入口脚本
比如用户访问 https://pan.example.com/s/xYz7,你不想让它 404,而是让 Apache 把这个路径交给 index.php?short=xYz7 处理。这就需要 RewriteRule 拦截 /s/xxx 并内部重写(非外部跳转)到 PHP 入口。
- 确保 Apache 已启用
mod_rewrite(常见于默认安装,可通过a2enmod rewrite启用) - 在网站根目录放置
.htaccess,或直接在虚拟主机配置中写入规则 - 关键规则示例(放在
.htaccess中):
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^s/([a-zA-Z0-9_-]+)$ index.php?short=$1 [L,QSA]说明:!-f 和 !-d 排除真实存在的文件或目录(避免影响 CSS/JS),[L] 表示终止后续规则,[QSA] 保留原始查询参数(如有)。
后端 PHP 必须承担的职责
上面重写只是第一步。index.php 收到 $_GET['short'] 后,要完成以下动作,才能支撑网盘文件分享场景:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 查数据库或缓存,确认
xYz7是否对应一个有效的网盘文件(含原始路径、过期时间、访问次数限制) - 检查是否需密码:若该短链设了密码,且用户未提交或错误,返回登录页或 403
- 记录访问日志(IP、UA、时间),用于统计和风控
- 生成 302 临时跳转响应(不建议用 301,因可能被浏览器/CDN 缓存,导致无法更新权限或统计失效)
- 跳转目标是网盘的真实文件地址(如
https://pan.example.com/download?id=8899&token=xxx),而非直接输出文件内容——这样便于做鉴权、限速、防盗链
安全与实用细节不能漏
网盘短链比普通跳转更敏感,几个关键点要同步处理:
-
防盗链:在 Apache 配置中对
/download或实际文件路径加Referer校验,或改用 token 签名(如?t=sha256(fileid+salt+time)),过期自动失效 - 防爆破:短码长度建议 ≥6 位(支持大小写字母+数字+下划线),避免用递增 ID;可结合 Redis 记录 IP 的 1 小时内请求数,超阈值封禁
-
HTTPS 强制:在重写规则前加一条强制跳转,防止明文传输 token 或密码:
RewriteCond %{HTTPS} off<br>RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] -
静态资源分离:CSS/JS/图片等不要和短链共用同一入口,否则重写规则可能误伤,建议放在
/static/目录并显式排除
为什么不推荐纯 Apache 301 跳转?
有人想用 RewriteRule ^s/([a-z0-9]+) https://real.url/file.pdf [R=301,L] 一劳永逸。这看似简单,但会彻底丢失所有动态能力:
- 无法做访问密码验证
- 无法统计谁在什么时候点过这个链接
- 无法限制单日访问次数或设置过期时间
- 无法对不同用户返回不同文件(如按会员等级提供高清/标清版)
- 一旦原始文件地址变更,所有已分发的短链就全部失效
所以网盘类短链必须保留 PHP(或等效后端)作为中间层,Apache 只负责“把路指对”,不代替业务逻辑做决定。










