如何使用PHP本地服务器(php.exe)创建SEO友好URL?
PHP内置服务器实现SEO友好URL
PHP内置开发服务器支持通过路由脚本实现URL重写,无需依赖Apache/Nginx的重写规则。以下是具体实现步骤:
1. 修改服务器启动命令
在原命令基础上,添加路由脚本参数(假设路由脚本名为router.php,放在项目根目录下,与web文件夹同级):
php -S localhost:80 -t "web/" router.php
这里-t "web/"指定文档根目录,router.php是自定义的路由处理脚本,所有请求会先经过它。
2. 编写路由脚本router.php
这个脚本负责解析SEO友好URL,映射到对应的PHP文件并传递参数。示例代码如下:
<?php // 获取请求的URI路径 $requestUri = $_SERVER['REQUEST_URI']; // 移除开头的斜杠和查询字符串 $path = trim(parse_url($requestUri, PHP_URL_PATH), '/'); $segments = explode('/', $path); // 处理博客URL:localhost/blog/2023/10/01/blog-post if (!empty($segments[0]) && $segments[0] === 'blog' && count($segments) === 5) { list($_, $year, $month, $day, $slug) = $segments; // 实际项目中,根据slug从数据库查询对应的文章ID // $postId = getBlogPostIdBySlug($slug); // $_GET['id'] = $postId; // 临时模拟:直接传递slug给blog.php $_GET['slug'] = $slug; // 加载对应的处理文件 include __DIR__ . '/web/blog.php'; exit; } // 处理艺术家作品URL:localhost/artist/Vincent-van-Gogh/art/Sunflowers if (!empty($segments[0]) && $segments[0] === 'artist' && count($segments) === 4) { list($_, $artistSlug, $_, $workSlug) = $segments; // 实际项目中,根据slug查询艺术家ID和作品ID // $artistId = getArtistIdBySlug($artistSlug); // $workId = getWorkIdBySlug($workSlug); // $_GET['id'] = $artistId; // $_GET['work'] = $workId; // 临时模拟:传递slug给artist.php $_GET['artist_slug'] = $artistSlug; $_GET['work_slug'] = $workSlug; // 加载对应的处理文件 include __DIR__ . '/web/artist.php'; exit; } // 处理静态资源或原有PHP文件(如直接访问localhost/blog.php?id=1) $targetFile = __DIR__ . '/web' . $requestUri; if (file_exists($targetFile) && is_file($targetFile)) { // 返回false,让内置服务器自行处理该文件 return false; } // 处理404情况 http_response_code(404); echo '404 Not Found'; exit;
3. 调整业务PHP文件
比如blog.php中,原本通过$_GET['id']获取参数,现在可以改为通过$_GET['slug']查询数据库内容:
<?php // blog.php $slug = $_GET['slug'] ?? ''; // 根据slug查询文章内容 // $post = getBlogPostBySlug($slug); // 输出文章内容...
关键说明
- 路由逻辑:路由脚本通过解析URL路径段,匹配预设的SEO URL规则,再转发到对应的业务文件,同时传递必要参数(slug或查询后的ID)。
- 静态资源兼容:脚本会检查请求的文件是否存在(如CSS、JS、图片),如果存在则返回
false,让内置服务器直接处理,不影响静态资源加载。 - 数据库依赖:实际项目中,你需要实现根据slug查询对应ID的逻辑,这部分需要结合你的数据库结构编写。
内容的提问来源于stack exchange,提问作者Mich_Lloid
相关产品推荐
相关产品推荐

