
在现代web应用中,用户友好的url(friendly urls或clean urls)已成为标准。它们不仅提升了用户体验,使url更具可读性和记忆性,还有助于搜索引擎优化(seo),因为它们通常包含与页面内容相关的关键词。例如,example.com/article/my-great-article 比 example.com/index.php?page=article&id=123 更受欢迎。
实现这种友好URL的关键技术是URL重写(URL Rewriting)和服务器端路由(Server-side Routing)。URL重写负责将用户在浏览器中输入的简洁URL映射到服务器上的实际处理脚本,而服务器端路由则在处理脚本中解析这些URL,以确定需要展示的内容。
Apache服务器通过 mod_rewrite 模块和 .htaccess 文件提供强大的URL重写功能。我们的目标是将所有非文件或非目录的请求都重写到 index.php(或您指定的任何入口文件),这样所有的请求都将由这个PHP文件统一处理。
请在您的网站根目录下创建或修改 .htaccess 文件,并添加以下规则:
# 启用RewriteEngine
RewriteEngine On
# 设置重写基路径,通常是网站根目录
RewriteBase /
# 如果请求的文件是 index.php 本身,则停止重写,直接处理
RewriteRule ^index\.php$ - [L]
# 如果请求的不是一个真实存在的文件
RewriteCond %{REQUEST_FILENAME} !-f
# 并且请求的不是一个真实存在的目录
RewriteCond %{REQUEST_FILENAME} !-d
# 则将所有请求重写到 /index.php
RewriteRule . /index.php [L]代码解释:
立即学习“PHP免费学习笔记(深入)”;
通过这些规则,当用户访问 example.com/wiki/Stack_Overflow 时,服务器内部实际上会将请求转发给 index.php,但浏览器地址栏中显示的仍然是 example.com/wiki/Stack_Overflow。
一旦所有请求都被重写到 index.php,您就可以在该文件中获取原始的请求URI,并对其进行解析,以确定用户想要访问的内容。$_SERVER['REQUEST_URI'] 超全局变量包含了用户请求的完整URI。
以下是 index.php 文件中的PHP代码示例,用于解析请求URI:
<?php
// 1. 获取原始请求URI
$REQUEST_URI = $_SERVER['REQUEST_URI'] ?? "";
// 2. 移除URI开头和结尾的斜杠,并进行URL净化
$requestedURL = trim($REQUEST_URI, '/');
$requestedURL = filter_var($requestedURL, FILTER_SANITIZE_URL);
// 3. 分割URL,将查询字符串与路径分离
$URL_array = explode('?', $requestedURL, 2); // 使用2限制分割次数,确保查询字符串完整
$destination = $URL_array[0]; // 获取路径部分
$queryString = $URL_array[1] ?? ""; // 获取查询字符串(如果有)
// 4. 将路径部分按斜杠分割成数组
$destinationParts = explode('/', $destination);
// 示例:输出解析结果
echo "<h3>URI 解析结果:</h3>";
echo "<pre>";
var_dump('$REQUEST_URI:', $REQUEST_URI); // 原始请求URI: /foo/bar?name=value
var_dump('$requestedURL:', $requestedURL); // 移除斜杠并净化后的URI: foo/bar?name=value
var_dump('$URL_array:', $URL_array); // 分割后的数组: Array ( [0] => foo/bar [1] => name=value )
var_dump('$destination:', $destination); // 路径部分: foo/bar
var_dump('$queryString:', $queryString); // 查询字符串: name=value
var_dump('$destinationParts:', $destinationParts); // 路径各部分数组: Array ( [0] => foo [1] => bar )
echo "</pre>";
// ... 在这里根据 $destinationParts 的值从数据库获取数据 ...
// 示例:根据解析结果模拟数据库查询
if (!empty($destinationParts) && $destinationParts[0] === 'wiki' && isset($destinationParts[1])) {
$articleSlug = $destinationParts[1]; // 假设第二个部分是文章的slug
echo "尝试从数据库中查找文章:<strong>" . htmlspecialchars($articleSlug) . "</strong><br>";
// 实际应用中,您会在这里执行数据库查询
// 例如:$stmt = $pdo->prepare("SELECT * FROM articles WHERE slug = ?");
// $stmt->execute([$articleSlug]);
// $article = $stmt->fetch();
// 模拟查询结果
if ($articleSlug === 'Stack_Overflow') {
echo "<p>欢迎来到 Stack Overflow 的文章页面!</p>";
// 显示文章内容
} else {
echo "<p>未找到关于 '" . htmlspecialchars($articleSlug) . "' 的文章。</p>";
}
} else {
echo "<p>欢迎来到主页或默认页面。</p>";
}
?>代码解释:
立即学习“PHP免费学习笔记(深入)”;
在获取到 $destinationParts 数组后,您就可以根据其中的值来决定要从数据库中检索什么数据。例如,对于 example.com/wiki/Stack_Overflow,$destinationParts[0] 可能是 wiki(表示文章类型),而 $destinationParts[1] 则是 Stack_Overflow(文章的唯一标识符,通常称为 slug)。
示例数据库查询逻辑(概念性):
// 假设 $destinationParts 已经解析为 ['wiki', 'Stack_Overflow']
if (count($destinationParts) >= 2 && $destinationParts[0] === 'wiki') {
$articleSlug = $destinationParts[1];
// 连接数据库 (使用PDO是最佳实践)
// $pdo = new PDO("mysql:host=localhost;dbname=your_db", "user", "password");
// $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 使用预处理语句防止SQL注入
// $stmt = $pdo->prepare("SELECT title, content FROM articles WHERE slug = :slug");
// $stmt->bindParam(':slug', $articleSlug);
// $stmt->execute();
// $articleData = $stmt->fetch(PDO::FETCH_ASSOC);
// if ($articleData) {
// // 渲染文章页面
// echo "<h1>" . htmlspecialchars($articleData['title']) . "</h1>";
// echo "<p>" . nl2br(htmlspecialchars($articleData['content'])) . "</p>";
// } else {
// // 文章不存在,显示404页面
// header("HTTP/1.0 404 Not Found");
// echo "<h1>404 Not Found</h1><p>您请求的文章不存在。</p>";
// }
} else {
// 处理其他路由,例如首页、联系我们等
// ...
}通过结合 .htaccess 的URL重写功能和PHP的URI解析能力,您可以有效地实现类似维基百科的友好URL结构。这种方法不仅提升了网站的用户体验和SEO表现,也为构建结构清晰、易于维护的Web应用程序奠定了基础。随着应用程序的增长,您可以进一步扩展此路由机制,以支持更复杂的业务逻辑和页面结构。
以上就是构建友好URL:使用.htaccess和PHP实现动态内容路由的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号