短链接还原提示“文件不存在”的真实原因是Web服务器未正确配置URL重写兜底,导致请求被当作静态文件处理而返回404;需在nginx中配置try_files,在Apache中开启RewriteEngine并设置合理规则,且PHP须通过$_SERVER['REQUEST_URI']准确提取短码。
文件不存在 的真实原因这不是路径写错了,而是 PHP 在解析短链接时根本没走到你预期的入口文件。常见于用 nginx 或 Apache 做 URL 重写后,短链接请求被直接转发给了静态文件处理模块(比如直接查 /a1b2c3 这个物理路径),而该路径下当然没有真实文件——于是返回 404。
nginx 下短链接还原必须配 try_files
PHP 短链接服务依赖路由兜底,不能靠文件系统自动匹配。Nginx 默认不支持“找不到文件就交给 index.php 处理”,必须显式声明。
location / { } 里没加 try_files,或只写了 try_files $uri $uri/ =404
location / {
try_files $uri $uri/ /index.php?$query_string;
}/s.php,则应改为:try_files $uri $uri/ /s.php?$query_string;
$query_string 不能省略,否则 ?id=a1b2c3 这类参数会丢失Apache 的 .htaccess 忘了开启 RewriteEngine
即使写了重写规则,RewriteEngine Off 或压根没这行,整个 RewriteRule 就是注释状态。
.htaccess 开头是否有:RewriteEngine On
/abc 映射到 /redirect.php?key=abc):RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ redirect.php?key=$1 [QSA,L]!-f 和 !-d 缺一不可:确保只有非真实文件/目录才触发重写[QSA] 要带上,否则原始 URL 中的查询参数会被丢弃重写成功后,PHP 还得从服务器变量里准确拿到短码。不同 Web 服务器传参方式不同,硬写 $_GET['key'] 很可能为空。
立即学习“PHP免费学习笔记(深入)”;
$_SERVER['REQUEST_URI'](如 /a1b2c3),再用 parse_url() 或正则提取短码$_SERVER['PATH_INFO'] 可能可用,但不稳定;更稳妥的是统一用 $_SERVER['REQUEST_URI']
$_SERVER['QUERY_STRING'] —— 短链接通常无问号,参数在路径里$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$shortCode = trim($path, '/');
if (empty($shortCode)) {
http_response_code(404);
exit;
}