如何使用.htaccess结合MySQL将站点动态游戏URL重写为语义化路径
URL美化实现方案
1. 前置环境确认
- 确认Apache服务器已开启
mod_rewrite扩展 - 确认站点配置中
AllowOverride参数设置为All,允许.htaccess文件生效
2. 编写.htaccess重写规则
在站点根目录新建或编辑.htaccess文件,写入以下规则:
RewriteEngine On # 将/games/游戏名 格式的请求内部转发到games.php处理,地址栏不跳转 RewriteRule ^games/([a-zA-Z0-9_-]+)/?$ games.php?enname=$1 [L,NC]
3. 调整PHP后端查询逻辑
原来的games.php是通过数字ID查询游戏数据,需要修改为按英文名查询:
// 原有逻辑(已废弃) // $gameId = intval($_GET['game']); // $sql = "SELECT * FROM 表名 WHERE id = {$gameId}"; // 新查询逻辑,注意做参数过滤避免SQL注入 $enname = addslashes(trim($_GET['enname'])); // 更推荐使用PDO预处理语句 $stmt = $pdo->prepare("SELECT * FROM 表名 WHERE enname = ?"); $stmt->execute([$enname]); $data = $stmt->fetch();
注意:需保证数据库中
enname字段为唯一值,避免出现多个游戏匹配同一个英文名的异常。
4. 旧链接301重定向(可选,建议配置)
如果旧格式链接已经被搜索引擎收录,可在games.php开头增加以下逻辑,将旧链接永久跳转到新格式链接,避免权重丢失:
// 检测是否是访问旧格式的带ID参数链接 if (isset($_GET['game']) && !isset($_GET['enname'])) { $gameId = intval($_GET['game']); $stmt = $pdo->prepare("SELECT enname FROM 表名 WHERE id = ?"); $stmt->execute([$gameId]); $enname = $stmt->fetchColumn(); if ($enname) { header("HTTP/1.1 301 Moved Permanently"); header("Location: /games/{$enname}"); exit(); } }
配置完成后,你页面中所有跳转游戏详情页的链接都可以直接写成/games/<?=$data['enname']?>格式即可。
内容的提问来源于stack exchange,提问作者yogev
相关产品推荐
相关产品推荐

