URL重写与动态路由:PHP中实现类似/article1的美观文章链接

本文介绍如何在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']) ?>

    

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简洁专业,同时保持代码高度复用与安全可控。