在 PHP 中,从完整的 URL中提取出核心路径

获取 这个 http://site.com/app/index.php/admin/user/delete?id=1 的核心路径

$_SERVER['REQUEST_URI'] 是 PHP 中用于获取当前请求的"路径"和"查询字符串"的超全局变量。

提供的 URL:http://site.com/app/index.php/admin/user/delete?id=1

$_SERVER['REQUEST_URI'] 获取到的内容是:

/app/index.php/admin/user/delete?id=1


🔍 详细拆解

$_SERVER['REQUEST_URI'] 包含了 URL 中 域名之后 、锚点(#)之前 的所有内容。它由两部分组成:

  1. Path(路径) : /app/index.php/admin/user/delete
  2. Query String(查询字符串) : id=1 (即 ? 及其后面的部分)

这两部分直接拼接在一起,中间没有额外的字符。

📊 对比其他相关变量

变量名 获取的内容 说明
$_SERVER['REQUEST_URI'] /app/index.php/admin/user/delete?id=1 路径 + 查询字符串 (最常用)
$_SERVER['SCRIPT_NAME'] /app/index.php 入口文件的路径 (通常用于路由分发时剔除)
$_SERVER['QUERY_STRING'] id=1 仅 查询字符串 部分
$_SERVER['PHP_SELF'] /app/index.php/admin/user/delete 当前执行脚本的路径 (不包含查询字符串,但在某些服务器配置下可能不稳定)

代码示例:

复制代码
// 第一步:获取完整请求 URI
$rawUri = $_SERVER['REQUEST_URI']; 
// 结果: /app/index.php/admin/user/delete?id=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

伪静态

伪静态的核心作用是让 Web 服务器(如 Nginx 或 Apache)在请求到达 PHP 之前,把"好看的 URL"内部重写成"带参数的入口文件 URL"。

当使用 Nginx 进行 URL 重写时:

当你在 Nginx 中配置了 URL 重写(也称为伪静态设置),用户的原始请求 URL 会被服务器重写为另一种形式,然后再发送到后端的 PHP 脚本。这种情况下,有两种主要方式来处理重写后的请求:

1. ‌使用 `$request_uri‌ 在 Nginx 中重写:

在 Nginx 配置中,你可以使用 rewrite 指令来重写请求。例如:

复制代码
location / {
    rewrite ^/product/([0-9]+)$ /index.php?page=product&id=$1 last;
}

在这个例子中,所有访问 /product/123 的请求都会被重写为 /index.php?page=product&id=123。在这种情况下,$_SERVER['REQUEST_URI'] 在 PHP 中将反映为 /index.php?page=product&id=123,而不是原始的 /product/123。

2. ‌保持原始 URI 使用 `$uri‌:

为了在 PHP 中获取原始 URI(即在浏览器地址栏中用户看到的 URL),你可以在 Nginx 中使用 $uri 或 $request_uri 并将其传递到 PHP。例如:

复制代码
location / {
    try_files $uri $uri/ /index.php?$args;
}

或者更明确地:

复制代码
location / {
    rewrite ^/product/([0-9]+)$ /index.php?page=product&id=$1 last;
    try_files $uri $uri/ /index.php?original_uri=$request_uri&$args;
}

结论:

  • 如果你希望在 PHP 中获取重写后的请求 URI,那么 $_SERVER['REQUEST_URI'] 将反映重写后的结果。
  • 如果你需要在 PHP 中获取并保留原始 URI,你需要在 Nginx 配置中显式地将原始 URI 作为查询参数传递到 PHP 脚本中,然后在 PHP 中通过 $_GET 或 $_REQUEST 访问这个参数。例如,使用 original_uri=$request_uri。

通过这种方式,你可以灵活地控制 PHP 脚本中可用的 URI 信息,无论是原始的还是经过重写的。

相关推荐
ITxiaobing20234 小时前
海外广告投放的 IP 定位服务怎么选?一份基于实测数据的选型参考
网络协议·tcp/ip·php
weixin_417396834 小时前
桌面云终端PXE启动失败怎么排查?从DHCP Option到镜像下发
开发语言·前端·php·技术·酒店·综合布线·弱电
ServBay6 小时前
PHP 突爆 9.2 分高危漏洞,你升级了吗?
后端·php
综合简报7 小时前
黑五海外发稿投给谁?三类海外媒体发稿渠道的分工
开发语言·php·媒体
子兮曰8 小时前
PHP漏洞危机,你的网站升级了吗?
前端·后端·php
Behavior9 小时前
影响约 70% 网站:OpenAI 牵头协调全球发现/修复 PHP 高危漏洞
php·openai·ai编程
fengci.9 小时前
BUUCTF(困难部分)
android·开发语言·前端·学习·php
苏琢玉9 小时前
PHP 这次是真的火了,只不过火得有点吓人
php
小白跃升坊12 小时前
PHP2Shell:AI 两天挖出 9.2 分漏洞,让全球 70% 网站连夜打补丁
php·1panel·ai安全·漏洞披露
骑着蜗牛撵大象32712 小时前
字节序、TLV 到 netlink:Linux 网络消息的编解码全链路
linux·网络·php·etl·序列化·字节序·tlv