当web服务器禁用pathinfo时,php无法通过$_server['path_info']获取复合后缀,需从$_server['request_uri']中提取:方法一用script_name截断并过滤;方法二用正则匹配末尾带点的文件名;方法三结合parse_url校验query_string。

当Web服务器(如Nginx)禁用pathinfo或Apache中AcceptPathInfo Off时,PHP无法通过$_SERVER['PATH_INFO']获取URL中问号前的路径段,导致形如/index.php/a/b/c.jpg的复合后缀(如c.jpg)无法被框架或路由自动解析。
确认pathinfo是否被禁用
新建一个test.php,写入<?php var_dump($_SERVER['PATH_INFO'] ?? 'not set'); ?>,访问/test.php/hello/world.png。若输出string(0) ""或not set,说明pathinfo已被服务器屏蔽。
此时不能依赖$_SERVER['PATH_INFO'],必须从$_SERVER['REQUEST_URI']或$_SERVER['SCRIPT_NAME']中手动剥离。
从REQUEST_URI中提取复合后缀
方法一:基于SCRIPT_NAME截断
第一步:获取当前脚本真实路径名,避免伪静态重写干扰:$script = $_SERVER['SCRIPT_NAME'] ?? '';
第二步:获取完整请求URI:$uri = $_SERVER['REQUEST_URI'] ?? '';
第三步:用substr()从$uri中移除$script开头部分,得到剩余路径段:$path = substr($uri, strlen($script));
第四步:用trim($path, '/')去首尾斜杠,再explode('/', ...)分割——最后一个非空元素即为复合后缀:$segments = array_filter(explode('/', trim($path, '/'))); $suffix = end($segments) ?: '';
注意:若URI含查询参数(如/index.php/a/b/c.jpg?x=1),$_SERVER['REQUEST_URI']会包含?x=1,必须先用parse_url($uri, PHP_URL_PATH)提取纯路径,否则substr可能错切。
兼容重写规则的健壮提取
方法二:正则匹配末尾文件名+扩展
preg_match('@/([^/]+?\.[^/]+?)$@', $_SERVER['REQUEST_URI'], $m); $suffix = $m[1] ?? '';
这个正则只捕获最后一个/后、不包含/和?的字符串,能正确提取c.jpg、data.json.gz、file.tar.bz2等复合后缀。
【关键前提】该正则假设URL路径以文件名结尾,且该文件名至少含一个点。若路径末尾是目录(如/api/v2/users/),则匹配失败,返回空字符串——这正是预期行为,无需额外判断。
方法三:结合QUERY_STRING做二次校验
当$_SERVER['QUERY_STRING']非空时,$_SERVER['REQUEST_URI']含?,直接用parse_url()更安全:$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); preg_match('@/([^/]+?\.[^/]+?)$@', $path, $m);
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











