通过$_SERVER['REQUEST_URI']获取请求路径与查询字符串,利用parse_url提取路径部分,再用str_replace去除入口文件名得到核心路径。伪静态下,$_SERVER['REQUEST_URI']反映重写后URL,原始URI需在Nginx配置中用$request_uri传入,以确保路由准确。该方法常用于框架路由解析。
PHP从URL提取核心路径的方法
时间:2026-06-07
浏览:422
文章目录
先看这个 URL:http://site.com/app/index.php/admin/user/deleteid=1。怎样才能干净地提取出核心路径 —— 也就是去掉域名和查询参数之后的部分?这在 PHP 开发中是极其常见的需求,尤其在路由分发场景下。

$_SERVER['REQUEST_URI'] 这个超全局变量,在 PHP 里专门用于获取当前请求的“路径”和“查询字符串”。以上述 URL 为例,它获取到的内容是:
/app/index.php/admin/user/deleteid=1
简单说,它包含了域名之后、锚点(#)之前的所有内容,由两部分拼接而成:路径 /app/index.php/admin/user/delete 和查询字符串 id=1(即问号及其后面的部分)。
详细拆解
为了更好地理解,我们把它与几个相关变量进行对比:
| 变量名 | 获取的内容 | 说明 |
|---|---|---|
$_SERVER['REQUEST_URI'] |
/app/index.php/admin/user/deleteid=1 |
路径 + 查询字符串(最常用) |
$_SERVER['SCRIPT_NAME'] |
/app/index.php |
入口文件的路径(常用于路由分发时剔除) |
$_SERVER['QUERY_STRING'] |
id=1 |
仅 查询字符串 部分 |
$_SERVER['PHP_SELF'] |
/app/index.php/admin/user/delete |
当前执行脚本的路径(不包含查询字符串,但在某些服务器配置下可能不稳定) |
接下来,看看如何通过代码从完整 URI 中剥离出核心路径:
// 第一步:获取完整请求 URI $rawUri = $_SERVER['REQUEST_URI']; // 结果: /app/index.php/admin/user/deleteid=1 // 第二步:只取路径部分(去除 id=1) $pathOnly = parse_url($rawUri, PHP_URL_PATH); // 结果: /app/index.php/admin/user/delete // 第三步:去除入口文件名 (假设入口文件是 index.php) $entryPoint = '/app/index.php'; // 通常来自 $_SERVER['SCRIPT_NAME'] $finalPath = str_replace($entryPoint, '', $pathOnly); // 结果: /admin/user/delete // 第四步:清理斜杠 $cleanPath = trim($finalPath, '/'); // 结果: admin/user/delete
伪静态
在实际项目中,还经常遇到伪静态(URL 重写)的情况。其核心作用是让 Web 服务器(如 Nginx 或 Apache)在请求到达 PHP 之前,将“好看 URL”内部重写成一个带参数入口文件的 URL。那么,$_SERVER['REQUEST_URI'] 的值会如何变化?需要区分两种情况。
当使用 Nginx 进行 URL 重写时
如果 Nginx 配置了 rewrite 指令,用户的原始请求 URL 会被重写,然后新的 URL 才发送给 PHP。例如:
location / {
rewrite ^/product/([0-9]+)$ /index.phppage=product&id=$1 last;
}
访问 /product/123 的请求会被重写为 /index.phppage=product&id=123。此时,PHP 中的 $_SERVER['REQUEST_URI'] 反映的是重写后的结果,即 /index.phppage=product&id=123,而不是原始的 /product/123。
若要在 PHP 中获取原始 URI,可以在 Nginx 配置中显式地把原始 URI 作为查询参数传递进来。例如通过 $request_uri 或 $uri:
location / {
try_files $uri $uri/ /index.php$args;
}
或者更明确地:
location / {
rewrite ^/product/([0-9]+)$ /index.phppage=product&id=$1 last;
try_files $uri $uri/ /index.phporiginal_uri=$request_uri&$args;
}
这样,PHP 中就可以通过 $_GET['original_uri'] 拿到用户浏览器实际显示的原始 URL 了。
结论
- 如果需要重写之后的 URI,直接使用
$_SERVER['REQUEST_URI']即可。 - 如果需要保留原始 URI,则必须在 Nginx 配置里手动将其作为参数传入,然后在 PHP 中用
$_GET或$_REQUEST读取。
掌握了这个区分,无论项目采用哪种路由方案,都能灵活地获取到所需的路径信息。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。