
本文详解如何通过url重写(rewrite)和动态路由,将php文章页面从`article.php?id=1`优化为语义化、seo友好的`/article1`或`/article/1`形式,避免生成大量静态文件,提升可维护性与用户体验。
在现代PHP网站开发中,为每篇文章单独创建HTML文件(如 article1.html、article2.html)不仅难以维护,还严重违背DRY原则。真正的解决方案是统一入口 + 动态路由 + URL重写——即所有文章请求都由一个PHP脚本(如 article.php)处理,而URL外观保持简洁美观(如 https://mywebsite.com/article/1 或 https://mywebsite.com/article/php-best-practices)。
✅ 核心技术栈说明
- URL重写(URL Rewriting):通过Web服务器配置(如Apache的.htaccess或Nginx的rewrite规则),将看似“静态”的路径(如 /article/1)内部转发给实际的PHP处理器(如 /article.php?id=1),用户浏览器地址栏仍显示友好URL。
- 动态路由(Dynamic Routing):PHP脚本根据解析出的参数(ID或slug)查询数据库,渲染对应文章内容。
- 语义化标识符(Slug)推荐:相比纯数字ID(/article/1),使用文章标题生成的URL友好的字符串(如 /article/how-to-use-url-rewriting)更利于SEO和可读性。
? 实现步骤(以Apache为例)
1. 启用重写模块并配置 .htaccess
确保Apache已启用 mod_rewrite,并在网站根目录创建 .htaccess 文件:
# 启用重写引擎
RewriteEngine On
# 排除真实存在的文件和目录(如CSS、JS、图片)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 将 /article/123 或 /article/my-post 转发给 article.php
RewriteRule ^article/(.+)$ article.php?slug=$1 [QSA,L]? QSA(Query String Append)保留原有GET参数;L(Last)表示终止后续规则。若想支持纯数字ID路由(如 /article/1),可改用 RewriteRule ^article/([0-9]+)$ article.php?id=$1 [QSA,L]。
2. 编写 article.php 统一路由处理器
prepare("SELECT * FROM articles WHERE slug = ? AND status = 'published'");
$stmt->execute([$slug]);
} elseif ($id && is_numeric($id)) {
// 回退:按ID查询(兼容性方案)
$stmt = $pdo->prepare("SELECT * FROM articles WHERE id = ? AND status = 'published'");
$stmt->execute([$id]);
} else {
http_response_code(404);
die('Article not found.');
}
$article = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$article) {
http_response_code(404);
die('Article not found.');
}
?>
= htmlspecialchars($article['title']) ?>
= htmlspecialchars($article['title']) ?>
= nl2br(htmlspecialchars($article['content'])) ?>
3. 数据库设计建议
CREATE TABLE articles (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
slug VARCHAR(255) UNIQUE NOT NULL, -- 自动生成,如 'how-to-use-url-rewriting'
content TEXT NOT NULL,
status ENUM('draft','published') DEFAULT 'published',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);✅ 新增文章时,用PHP生成slug(如 mb_strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $title)))),并确保去重(如追加-2)。
⚠️ 关键注意事项
- 安全第一:永远使用预处理语句(PDO/MySQLi)防止SQL注入;对输出内容执行 htmlspecialchars() 防XSS。
- 404处理:未匹配到文章时务必返回HTTP 404状态码,利于SEO。
- 缓存与性能:高流量站点建议添加OPcache、查询结果缓存(如Redis),或生成静态HTML快照。
-
Nginx用户:替换为等效配置:
location /article/ { try_files $uri $uri/ /article.php?slug=$request_uri; } - SEO补充:在 中添加规范URL(),避免重复内容。
通过以上方案,你将彻底告别海量静态文件,获得可扩展、易维护、搜索引擎友好的文章系统——这才是现代PHP内容网站的标准实践。
立即学习“PHP免费学习笔记(深入)”;











