PHP短链接返回404的常见原因:未获取原始路径、重写规则截断参数、短码查库失败且无兜底跳转;需检查Nginx/Apache重写配置、$_GET参数传递及PHP层格式校验与容错处理。

短链接跳转直接 404 的常见原因
PHP 短链接返回 404,通常不是路由没配好,而是 $_GET 没拿到原始路径、重写规则截断了参数、或短码查库失败后没兜底跳转。Nginx/Apache 的 rewrite 规则常把 /abc123 当作静态路径处理,根本没交给 PHP;或者 Apache 的 .htaccess 忘了加 RewriteBase,导致 $_SERVER['REQUEST_URI'] 解析错位。
mod_rewrite 下如何确保短码进 PHP
Apache 用户必须确认两点:一是 AllowOverride All 已启用,二是 .htaccess 内规则能捕获所有短码请求且不丢参。典型安全写法如下:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9]{4,12})$ index.php?short=$1 [QSA,L]
关键点:
-
!-f和!-d排除真实文件/目录,避免覆盖 favicon.ico 或 assets -
^([a-zA-Z0-9]{4,12})$限制短码长度和字符集,防恶意路径遍历 -
[QSA,L]中QSA保留原始 query 参数(如/abc123?ref=utm),L终止后续规则
Nginx 中 try_files 配置漏掉 $args 就会丢参
Nginx 不像 Apache 自动拼接 query string,try_files 后的 index.php 必须显式带 $args,否则 $_GET['short'] 为空:
立即学习“PHP免费学习笔记(深入)”;
location / {
try_files $uri $uri/ /index.php?short=$uri&$args;
}
注意:$uri 是解码后的路径(如 /abc123),不是原始 $request_uri;若短码含特殊字符(如 +),需用 $request_uri 并在 PHP 里手动 parse,但更推荐前端 URL encode 后再提交。
PHP 层查不到短码时别直接 404,先验格式再 fallback
很多代码一查数据库没结果就 http_response_code(404),其实应分两步:先校验 $_GET['short'] 是否符合预设格式(比如是否为空、是否超长、是否含非法字符),再查库。查不到时建议跳转首页或返回自定义提示页,而非裸 404:
容易被忽略的是:没对
$short做trim()和urldecode(),尤其当 Nginx 透传原始$request_uri时,可能带空格或编码字符,导致查库失败。











