
本文介绍如何在php网站中通过url重写(rewrite)和动态路由机制,将冗长的`?articleid=1`参数式链接转换为简洁美观的`/article1`或`/article/1`等伪静态路径,提升seo与用户体验。
在现代PHP内容网站中,直接为每篇文章创建独立HTML文件(如 article1.html)不仅难以维护,还违背了DRY(Don’t Repeat Yourself)原则。更专业、可扩展的做法是:统一使用单个PHP入口(如 article.php),配合URL重写规则,将形如 /article/123 的请求“隐式转发”给该脚本处理——用户看到的是干净路径,后端执行的仍是动态查询。
✅ 核心技术:URL重写(Apache/Nginx) + 动态路由
1. 启用URL重写(以Apache为例)
在项目根目录创建或编辑 .htaccess 文件:
# 启用重写引擎
RewriteEngine On
# 防止重写静态资源(CSS/JS/图片等)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 将 /article/123 → /article.php?id=123
RewriteRule ^article/([0-9]+)/?$ article.php?id=$1 [L,QSA]
# 可选:支持 /article1 → /article.php?id=1(需确保无冲突)
# RewriteRule ^article([0-9]+)/?$ article.php?id=$1 [L,QSA]⚠️ 注意:确保Apache已启用 mod_rewrite 模块,并在虚拟主机配置中允许 .htaccess 覆盖(AllowOverride All)。
2. 编写动态文章处理器(article.php)
prepare("SELECT title, content, created_at FROM articles WHERE id = ?");
$stmt->execute([$id]);
$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. Nginx 用户替代方案(nginx.conf 片段)
location ^~ /article/ {
rewrite ^/article/([0-9]+)/?$ /article.php?id=$1 last;
}? 关键要点与最佳实践
- 永远不要直接拼接 $_GET 参数到SQL中:必须使用PDO预处理或MySQLi绑定参数,杜绝SQL注入。
- 输出前转义HTML内容:使用 htmlspecialchars() 防止XSS攻击。
- 返回正确HTTP状态码:查无结果时发送 404 Not Found,而非空白页或200。
- SEO友好建议:在数据库中为每篇文章添加 slug 字段(如 how-to-use-url-rewrite),改用 /article/how-to-use-url-rewrite,更语义化且利于排名。
- 避免过度重写:确保重写规则不干扰真实存在的静态文件(CSS/JS/图片),.htaccess 中的 !-f 和 !-d 条件必不可少。
通过以上配置,你的网站即可优雅支持无限量文章,URL简洁专业,同时保持代码高度复用与安全可控。











