PHP 网站实现 URL 伪静态有五种方法:一、Apache 通过 mod_rewrite 配置。htaccess;二、Nginx 在 server 块中配置 rewrite 指令;三、PHP 代码结合 PATH_INFO 解析路由;四、使用 ThinkPHP 等框架内置路由;五、本地开发用 PHP 内置服务器配合 router 脚本调试。

如果您正在使用 PHP 网站并希望提升 URL 的可读性与 搜索引擎 友好度,则需要将动态 URL 转换为更简洁、更符合语义的静态形式。以下是实现 PHP 网站 URL 伪静态的具体方法:
一、通过 Apache 的 mod_rewrite 模块配置。htaccess文件
该方法适用于使用 Apache 服务器且具备 mod_rewrite 模块权限的环境。通过在网站根目录下创建或修改。htaccess 文件,可直接定义重写规则,无需修改 PHP 代码逻辑。
1、确认服务器已启用 mod_rewrite 模块,并在虚拟主机配置中允许 Override 指令使用 FileInfo。
2、在网站根目录新建或编辑名为 .htaccess 的文件(注意开头为英文点号)。
立即学习“PHP 免费学习笔记(深入)”;
3、在文件中添加以下基础重写规则:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^article/([0-9]+)$ /article.php?id=$1 [L]
4、保存后上传至服务器,访问如 /article/123 即可由 article.php?id=123 响应。
二、通过 Nginx 服务器配置 location 与 rewrite 指令
该方法适用于部署在 Nginx 服务器上的 PHP 站点。Nginx 不支持。htaccess,需在 server 块中直接配置重写逻辑,并确保 PHP-FPM 正确传递 QUERY_STRING。
1、编辑对应站点的 Nginx 配置文件,通常位于 /etc/nginx/sites-available/ 或/usr/local/nginx/conf/vhost/目录下。
2、在 server 块内添加如下 location 规则:
location /article/ {n rewrite ^/article/([0-9]+)/?$ /article.php?id=$1 last;n}
3、确保已存在 PHP 处理块,例如:
location ~ .php$ {fastcgi_pass 127.0.0.1:9000; …}
4、执行 nginx -t 验证语法,再运行 nginx -s reload 重载配置。
三、在 PHP 代码中结合 PATH_INFO 实现伪静态 路由
该方法不依赖服务器重写模块,而是利用 PHP 的 PATH_INFO 特性解析请求路径,在入口文件中统一分发请求,适合轻量级框架或自定义路由需求。
1、确保 PHP 配置中cgi.fix_pathinfo=1(默认开启),并在 Apache 或 Nginx 中启用 PATH_INFO 支持。
2、创建统一入口 index.php,置于网站根目录。
3、在 index.php 中获取 PATH_INFO 内容:
$path = $_SERVER[‘PATH_INFO’] ?? ”;
4、使用正则匹配提取参数,例如:
if (preg_match(‘#^/product/(d+)$#’, $path, $matches)) {
$id = (int)$matches[1];
include ‘product.php’;
exit;
}
四、使用 ThinkPHP 等框架内置路由功能
主流 PHP 框架已封装完整伪静态支持,开发者仅需声明路由规则,框架自动完成 URL 解析与分发,无需手动编写重写规则。
1、在 ThinkPHP6 中打开 config/route.php 文件。
2、添加闭包路由示例:
Route::get(‘news/:id’, ‘index/news/read’);
3、确保应用配置中开启 ‘url_route_must’ => true 及‘url_html_suffix’ => ‘html’等选项。
4、访问 /news/456.html 即可映射到 index 控制器的 news 控制器 read 操作。
五、通过 PHP 内置 Web 服务器配合 Router 脚本调试伪静态
该方法适用于本地开发阶段快速验证伪静态逻辑,无需配置真实 Web 服务器,利用 PHP 内置服务模拟重写行为。
1、创建 router.php 文件,内容为:
if (preg_match(‘//article/(d+)/’, $_SERVER[‘REQUEST_URI’], $m)) {
$_GET[‘id’] = $m[1];
include ‘article.php’;
exit;
}
2、在命令行执行:php -S localhost:8000 router.php
3、浏览器 访问http://localhost:8000/article/789,请求将被 router.php 捕获并注入 GET 参数。