PHP含空格与连字符的URL重写:实现SEO友好URL技术问询
实现SEO友好URL(含连字符保留与分类匹配)
一、.htaccess 重写规则
先确保服务器开启了mod_rewrite模块,然后在/catalog/parts/目录下创建.htaccess文件,添加以下规则:
RewriteEngine On # 仅当请求的不是真实文件/目录时触发重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 把URL路径部分作为cat参数转发到index.php RewriteRule ^(.*)$ index.php?cat=$1 [L,QSA]
这条规则会把example.com/catalog/parts/hex-bolt这类请求,转发到index.php并将hex-bolt作为cat参数传递。QSA参数用于保留原URL中的其他查询参数(如果有的话)。
二、PHP 处理逻辑
1. 生成SEO友好URL(链接生成阶段)
要生成符合要求的URL,需要把原分类名称转换成标准化的slug:
- 空格替换为连字符
- - 保留分类本身自带的连字符
- 统一转小写
- (可选)清理特殊字符、合并连续连字符
示例转换函数:
function makeCategorySlug($categoryName) { // 替换空格为连字符 $slug = str_replace(' ', '-', $categoryName); // 转小写 $slug = strtolower($slug); // 移除字母、数字、连字符之外的多余字符 $slug = preg_replace('/[^a-z0-9-]/', '', $slug); // 合并连续的多个连字符为单个 $slug = preg_replace('/-+/', '-', $slug); return $slug; } // 测试示例 echo makeCategorySlug('Hex Bolt'); // 输出 hex-bolt echo makeCategorySlug('U-Bolt'); // 输出 u-bolt echo makeCategorySlug('Tension Control Bolt'); // 输出 tension-control-bolt
建议在数据库的分类表中新增slug字段,提前生成并存储每个分类的唯一slug——这样既不用实时转换,也能避免不同分类生成重复slug的冲突(比如U Bolt和U-Bolt如果不处理会生成相同slug,可在后台创建分类时检查slug唯一性)。
2. 处理请求并查询分类
用户访问SEO URL时,PHP从$_GET['cat']获取slug,直接用slug查询数据库的slug字段即可,不要尝试把连字符还原为空格——因为原分类自带的连字符和空格转的连字符无法区分,还原后会导致查询错误。
示例查询代码(注意用预处理语句防SQL注入):
if (isset($_GET['cat'])) { $slug = $_GET['cat']; // 初始化PDO连接(替换为你的数据库信息) $pdo = new PDO('mysql:host=你的主机;dbname=你的数据库', '用户名', '密码'); $stmt = $pdo->prepare("SELECT * FROM categories WHERE slug = ?"); $stmt->execute([$slug]); $category = $stmt->fetch(PDO::FETCH_ASSOC); if ($category) { // 找到分类,执行页面逻辑 echo "当前分类:" . $category['name']; } else { // 分类不存在,返回404 http_response_code(404); echo "分类不存在"; } } else { // 无cat参数,显示分类列表或首页 echo "分类列表"; }
内容的提问来源于stack exchange,提问作者bill_meister
相关产品推荐
相关产品推荐

