Apache不直接还原短链接,仅通过RewriteRule(如^([a-zA-Z0-9]{3,8})$→/redirect.php?code=$1 [L,QSA])将短码透传给后端PHP脚本;真实还原逻辑(查库、302跳转或微信兼容处理)须由redirect.php实现,Apache只负责路由分发与静态服务。

Apache 本身不直接“还原”短链接,它只负责按规则把请求转发给后端处理程序(比如 PHP 脚本或 API 接口)。真正的还原逻辑——查数据库、匹配 shorturl、取出 longurl、执行重定向——必须由你写的处理器完成。Apache 的角色是把形如 /abc123 这样的路径,干净地交给你的还原脚本,而不是暴露真实文件名或触发 404。
用 RewriteRule 捕获短码并透传给处理器
在 Apache 配置(如 .htaccess 或虚拟主机配置)中,添加以下规则:
- 启用重写引擎:
RewriteEngine On - 跳过真实存在的文件和目录(避免干扰静态资源):
RewriteCond %{REQUEST_FILENAME} !-f和RewriteCond %{REQUEST_FILENAME} !-d - 捕获 3–8 位字母数字短码,并转发给统一入口:
RewriteRule ^([a-zA-Z0-9]{3,8})$ /redirect.php?code=$1 [L,QSA]
这样访问 https://yourdomain.com/xyz789 时,Apache 不会报 404,而是悄悄调用 redirect.php?code=xyz789,且保留原始查询参数(QSA)。
redirect.php 要做的事:查库、跳转、加响应头
这个 PHP 文件就是真正的“还原处理器”。它不渲染页面,只做三件事:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 从
$_GET['code']取出短码,查数据库(如 MySQL 表t_url_map)找对应 longurl - 若找到,输出
HTTP/1.1 302 Found状态,并设置Location: https://xxx...响应头 - 若没找到,返回
404 Not Found或自定义错误页(避免被爬虫滥用)
注意:不要用 header("Location: ...") 后再 echo 内容,否则可能触发“headers already sent”错误;确保无空白输出、无 BOM。
微信/QQ 等 App 内浏览器的兼容要点
这些内置浏览器常拦截标准 302 跳转。如果你发现短链在微信里打不开目标页,不是 Apache 配置问题,而是客户端限制。应对方式有:
- 在
redirect.php中检测$_SERVER['HTTP_USER_AGENT']是否含 “MicroMessenger” 或 “QQ/”(仅作参考,不可靠但常用) - 对这类 UA,不发 302,改用 HTML + meta refresh 或 JS 跳转(例如输出
<meta http-equiv="refresh" content="0;url=...">) - 更推荐的做法:前端 H5 或小程序不依赖跳转,而是先调用
/api/v1/expand?code=xxx获取长链接,再由 JS 自行window.location.href—— 完全可控
别让 Apache 干本该由后端干的活
有人试图用 RewriteMap + 外部程序或 DBD 实现“Apache 直接查库跳转”,技术上可行但不实用:
- 性能差:每次请求都触发外部进程或数据库连接,远不如 PHP 连接池或 Redis 缓存高效
- 维护难:逻辑分散在 Apache 配置和数据库之间,调试困难
- 扩展性弱:加统计、限流、鉴权、灰度等功能时,Apache 配置很快失控
正确分工是:Apache 做路由分发 + SSL 终止 + 静态资源服务;还原、缓存、日志、风控全部交由 PHP/Node/Java 等后端服务处理。

















