本文详解如何通过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)。
确保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]。
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 no
t 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'])) ?>
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)。
location /article/ {
try_files $uri $uri/ /article.php?slug=$request_uri;
}通过以上方案,你将彻底告别海量静态文件,获得可扩展、易维护、搜索引擎友好的文章系统——这才是现代PHP内容网站的标准实践。