You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:14:54