使用.htaccess实现带斜杠、下划线或日期分隔符的友好URL重定向问题求助
嘿,我来帮你排查这个.htaccess重写的问题!先看你已经成功的例子,你之前的规则写得没问题,但这次的规则踩了个小坑,咱们一步步来解决~
你想要实现的是:要么访问新的友好URL https://example.com/2023/not-the-dinner-day-photographs 时,服务器内部加载旧路径 archive/galleries/2023/20230204_ntdd/ 的内容;要么是访问旧路径时自动跳转到新URL。先看你自己写的规则问题出在哪:
你写的规则里:
RewriteRule ^(\d{4})/not-the-dinner-day-photographs/?$ archive/galleries/$1/$2_ntdd/ [NC,L]
这里的$2完全没有被捕获到!因为你的正则表达式里只有一个捕获组(\d{4}),所以$2是空值,导致重写后的路径变成archive/galleries/2023/_ntdd/,这显然和你要的旧路径不符。
情况1:内部重写(访问新URL,加载旧路径内容)
如果旧路径里的日期后缀是固定的(比如20230204就是年份+0204),那可以直接把年份和固定日期拼接起来:
RewriteEngine On # 新URL重写到旧路径,自动拼接年份+固定日期 RewriteRule ^(\d{4})/not-the-dinner-day-photographs/?$ archive/galleries/$1/$10204_ntdd/ [NC,L]
这里的$10204会被解析为$1(捕获到的年份,比如2023)加上0204,刚好拼成20230204,完美匹配旧路径的文件夹名。
如果旧路径里的日期是任意的(只要是年份开头的,比如2023xxxx),那需要用RewriteCond先确认目标文件夹存在,再重写:
RewriteEngine On # 先捕获年份,确认对应的旧文件夹存在 RewriteCond %{DOCUMENT_ROOT}/archive/galleries/%1/%1[^/]+_ntdd/ -d RewriteRule ^(\d{4})/not-the-dinner-day-photographs/?$ archive/galleries/$1/$1[^/]+_ntdd/ [NC,L]
情况2:外部永久重定向(访问旧URL,跳转到新URL)
如果你是想让旧URL的访问者自动跳转到新的友好URL(对SEO更友好,建议用301永久重定向),那规则要反过来写:
RewriteEngine On # 匹配旧路径,捕获年份,重定向到新URL RewriteRule ^archive/galleries/(\d{4})/\d{4}_ntdd/?$ /$1/not-the-dinner-day-photographs/ [R=301,NC,L]
这里的正则^archive/galleries/(\d{4})/\d{4}_ntdd/?$会匹配所有以年份开头、结尾是_ntdd的旧文件夹路径,捕获年份后跳转到对应的新URL。
备注:内容来源于stack exchange,提问作者hobbsie

