无需htaccess,通过PHP实现URL重定向及URL捕获方法咨询
嘿,我来帮你一步步搞定这个问题!
一、纯PHP捕获URL并处理重定向/路由
不用.htaccess的话,核心是靠PHP的超全局变量$_SERVER['REQUEST_URI']捕获用户请求的URL路径,再根据路径逻辑决定重定向或者加载对应内容。
1. 捕获请求URL
$_SERVER['REQUEST_URI']会返回当前请求的完整路径(含查询参数),比如用户访问https://mysite.com/postname,这个变量的值就是/postname;如果访问https://mysite.com/category/tech?page=2,它的值就是/category/tech?page=2。
你可以用parse_url()拆分这个URI,方便提取路径和参数:
$request_uri = $_SERVER['REQUEST_URI']; $parsed_uri = parse_url($request_uri); $path = $parsed_uri['path']; // 提取干净的路径,比如 /postname 或 /category/tech $query_params = []; if (isset($parsed_uri['query'])) { parse_str($parsed_uri['query'], $query_params); // 把查询参数转成数组,方便使用 }
2. 根据路径处理逻辑
拿到路径后,写条件判断匹配不同URL,要么用header()重定向,要么直接加载对应页面:
// 示例1:把 /postname 重定向到 index.php?post=postname if ($path === '/postname') { // 注意:header()之前绝对不能有任何输出(包括空格、HTML标签) header('Location: /index.php?post=postname'); exit(); // 一定要退出,避免后续代码继续执行 } // 示例2:直接加载对应内容,不做重定向 if (str_starts_with($path, '/category/')) { $category_name = substr($path, strlen('/category/')); // 加载分类页面的逻辑 include 'category-page.php'; exit(); } // 默认情况:加载首页 include 'index.php';
⚠️ 小提醒:如果你的代码不小心有输出(比如空格、提前打印的HTML),可以用ob_start()开启输出缓冲,避免触发"headers already sent"错误。
二、WordPress的URL处理机制
WordPress的“漂亮URL”(比如mysite.com/postname)并不是用PHP直接捕获URL再转向index.php的,而是依赖服务器重写规则(比如Apache的mod_rewrite或Nginx的rewrite配置),把所有非静态文件的请求都转发到根目录的index.php,再由PHP代码解析请求。
1. 关键流程和文件
- 第一步:服务器通过
.htaccess(Apache)或Nginx配置,把所有请求(除了已存在的文件/文件夹)导向根目录的index.php; - 第二步:
index.php作为WordPress的入口,会加载wp-blog-header.php,初始化核心环境; - 第三步:真正负责解析URL、匹配内容的是
wp-includes/class-wp.php里的WP类,尤其是parse_request()方法——它会分析$_SERVER['REQUEST_URI'],把漂亮URL转换成对应的查询参数(比如把/postname转成?name=postname),再加载对应的文章、页面或内容。
简单说:WordPress是先让服务器把所有请求送进index.php,再用PHP处理路由,而非用PHP捕获URL后转向index.php。
内容的提问来源于stack exchange,提问作者AA Shakil

