如何用.htaccess RewriteRule批量重写URL并移除日期前缀
URL批量重写问题求助
我有数百个形如https://www.example.com/YYYY/MM/DD/xxx的URL,希望通过.htaccess配合PHP实现批量URL重写,不用逐个添加RewriteRule规则。需求是移除URL开头的日期前缀,替换成指定路径/blog/,具体示例如下:
示例1:
原URL:https://www.example.com/2023/03/03/5-abc-blog-name-or-url/
重写后URL:https://www.example.com/blog/5-abc-blog-name-or-url/示例2:
原URL:https://www.example.com/2022/04/01/abc-xyz-blog-name-or-url-235/
重写后URL:https://www.example.com/blog/abc-xyz-blog-name-or-url-235/
我尝试了以下代码但未生效,求帮忙解决:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([0-9]+)$/ /blog/$ [L]
问题分析与修正方案
你写的正则规则有几个问题:只匹配了单个数字段,没覆盖YYYY/MM/DD这种三段日期结构,而且正则语法有误($符号位置不对,也没捕获后面的路径部分)。修正后的.htaccess规则如下:
RewriteEngine On # 排除实际存在的目录和文件,避免误重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 匹配YYYY/MM/DD/xxx格式的URL,捕获xxx部分并重写到/blog/xxx RewriteRule ^[0-9]{4}/[0-9]{2}/[0-9]{2}/(.*)$ /blog/$1 [L,R=301]
规则说明:
^[0-9]{4}/[0-9]{2}/[0-9]{2}/(.*)$:精准匹配开头的4位年份、2位月份、2位日期,然后捕获后面的所有路径内容(也就是示例里的xxx部分)[L,R=301]:L表示这是最后一条规则,R=301表示永久重定向,对SEO更友好;如果只是内部跳转不需要地址栏变化,去掉R=301即可- 两条
RewriteCond确保不会重写真实存在的文件或目录,避免影响站点其他功能
PHP配合处理(可选)
如果需要在PHP中获取原URL的日期信息做后续处理(比如统计归档),可以在blog目录下的入口文件(比如index.php)中通过$_SERVER['REDIRECT_URL']获取原始请求路径,解析出日期:
// 获取原始请求的路径 $originalPath = $_SERVER['REDIRECT_URL']; // 匹配日期部分 if (preg_match('/^\/([0-9]{4})\/([0-9]{2})\/([0-9]{2})\//', $originalPath, $matches)) { $year = $matches[1]; $month = $matches[2]; $day = $matches[3]; // 后续可根据日期做逻辑处理,比如查询对应文章 }
内容的提问来源于stack exchange,提问作者SIHala
相关产品推荐
相关产品推荐

