URL重写与动态路由:PHP网站实现简洁文章URL的完整教程
发布时间 - 2025-12-26 00:00:00 点击率:次本文详解如何通过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->f
etch(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内容网站的标准实践。
# css
# mysql
# php
# redis
# html
# js
# apache
# nginx
# 处理器
# seo
# 浏览器
# app
# sql
# xss
# String
# mysqli
# pdo
# 标识符
# 字符串
# 栈
# append
# href
# 数据库
# http
# https
# 搜索引擎
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
香港服务器如何优化才能显著提升网站加载速度?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
Laravel如何与Pusher实现实时通信?(WebSocket示例)
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
Laravel安装步骤详细教程_Laravel环境搭建指南
香港服务器网站推广:SEO优化与外贸独立站搭建策略
免费视频制作网站,更新又快又好的免费电影网站?
三星网站视频制作教程下载,三星w23网页如何全屏?
iOS正则表达式验证手机号、邮箱、身份证号等
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
如何有效防御Web建站篡改攻击?
高端建站如何打造兼具美学与转化的品牌官网?
中山网站推广排名,中山信息港登录入口?
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
Python自动化办公教程_ExcelWordPDF批量处理案例
怎么用AI帮你为初创公司进行市场定位分析?
详解Huffman编码算法之Java实现
如何在阿里云服务器自主搭建网站?
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
详解jQuery停止动画——stop()方法的使用
Laravel如何保护应用免受CSRF攻击?(原理和示例)
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
如何快速查询网站的真实建站时间?
,南京靠谱的征婚网站?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
利用python获取某年中每个月的第一天和最后一天
如何快速搭建个人网站并优化SEO?
Laravel如何使用Gate和Policy进行授权?(权限控制)
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
如何快速搭建二级域名独立网站?
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
Python文本处理实践_日志清洗解析【指导】
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
如何在宝塔面板中创建新站点?
如何确保FTP站点访问权限与数据传输安全?
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
EditPlus中的正则表达式 实战(1)
微信小程序 配置文件详细介绍
如何正确下载安装西数主机建站助手?


etch(PDO::FETCH_ASSOC);
if (!$article) {
http_response_code(404);
die('Article not found.');
}
?>