PHP从URL提取核心路径的方法

作者:技术拾光时间:2026-06-07 08:13:07浏览:423

通过$_SERVER['REQUEST_URI']获取请求路径与查询字符串,利用parse_url提取路径部分,再用str_replace去除入口文件名得到核心路径。伪静态下,$_SERVER['REQUEST_URI']反映重写后URL,原始URI需在Nginx配置中用$request_uri传入,以确保路由准确。该方法常用于框架路由解析。

先看这个 URL:http://site.com/app/index.php/admin/user/deleteid=1。怎样才能干净地提取出核心路径 —— 也就是去掉域名和查询参数之后的部分?这在 PHP 开发中是极其常见的需求,尤其在路由分发场景下。

PHP从URL提取核心路径的方法

$_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 读取。

掌握了这个区分,无论项目采用哪种路由方案,都能灵活地获取到所需的路径信息。