如何通过.htaccess实现带分类名与文章路径的URL重写
重写规则配置方案
首先确认前置条件:Apache 已开启 mod_rewrite 扩展,且站点目录配置中 AllowOverride 参数设为 All,保证 .htaccess 文件可以正常生效。
将以下配置写入你blog目录下的.htaccess文件即可:
RewriteEngine On # 美化URL映射:将 /blog/分类名/文章路径 转发到实际PHP处理文件 RewriteRule ^([^/]+)/([^/]+)/?$ post_details.php?category_name=$1&post_id=$2 [L,QSA]
规则说明
- 正则部分
^([^/]+)/([^/]+)/?$:匹配blog目录下的两级路径,第一组([^/]+)捕获分类名称,第二组([^/]+)捕获文章标识post_url,末尾的/?兼容末尾带斜杠和不带斜杠的两种访问形式 $1、$2分别对应前面正则捕获到的分类名、文章标识参数,直接传入到原PHP文件的查询参数中- 标记
[L]代表匹配到当前规则后停止后续重写逻辑,[QSA]表示保留原URL中携带的其他额外查询参数(如果有相关需求)
如果需要将旧的访问URL自动301跳转到新的美化格式,避免搜索引擎重复收录,可以额外增加以下规则:
# 旧URL 301跳转到新美化URL RewriteCond %{THE_REQUEST} /post_details\.php\?category_name=([^&]+)&post_id=([^&\s]+) [NC] RewriteRule ^post_details\.php$ /blog/%1/%2? [L,R=301,NC]
注意事项
- 部署完成后建议清除浏览器缓存后再测试,301跳转规则会被浏览器默认缓存,容易导致测试结果不符合预期
- 若你的分类或文章标识仅支持英文、数字、下划线、短横线,可将正则中的
[^/]+替换为[a-zA-Z0-9_-]+,规则匹配会更严谨
内容的提问来源于stack exchange,提问作者Vikash Anand Jha
相关产品推荐
相关产品推荐

