电商网站.htaccess重定向规则失效跳转首页问题求助
问题描述
需要将电商网站的旧URL格式重定向到新格式:
- 旧URL:
site.com/{languageIsoCode}/categoryName/{productId}-productName-{productEAN}.html - 新URL:
{languageIsoCode}/{productId}-productName.html
示例:http://www.site.com/en/watches/784-smart-watch-745527474.html → http://www.site.com/en/784-smart-watch.html
本地开发域名为 bov.loc(HTTP协议,生产环境使用HTTPS),在.htaccess底部添加自定义RewriteRule后,重定向直接跳转到首页,无法实现预期效果。
当前完整.htaccess代码
<IfModule mod_rewrite.c> <IfModule mod_env.c> SetEnv HTTP_MOD_REWRITE On </IfModule> RewriteEngine on #Domain: bov.loc RewriteRule . - [E=REWRITEBASE:/] RewriteRule ^api(?:/(.*))?$ %{ENV:REWRITEBASE}webservice/dispatcher.php?url=$1 [QSA,L] # Images RewriteCond %{HTTP_HOST} ^bov.loc$ RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.jpg [L] RewriteCond %{HTTP_HOST} ^bov.loc$ RewriteRule ^([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$2/$1$2$3$4.jpg [L] RewriteCond %{HTTP_HOST} ^bov.loc$ RewriteRule ^([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$2/$3/$1$2$3$4$5.jpg [L] RewriteCond %{HTTP_HOST} ^bov.loc$ RewriteRule ^([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$2/$3/$4/$1$2$3$4$5$6.jpg [L] RewriteCond %{HTTP_HOST} ^bov.loc$ RewriteRule ^([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6$7.jpg [L] RewriteCond %{HTTP_HOST} ^bov.loc$ RewriteRule ^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7$8.jpg [L] RewriteCond %{HTTP_HOST} ^bov.loc$ RewriteRule ^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8$9.jpg [L] RewriteCond %{HTTP_HOST} ^bov.loc$ RewriteRule ^c/([0-9]+)(\-[\.*_a-zA-Z0-9-]*)(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/c/$1$2$3.jpg [L] RewriteCond %{HTTP_HOST} ^bov.loc$ RewriteRule ^c/([a-zA-Z_-]+)(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/c/$1$2.jpg [L] # AlphaImageLoader for IE and fancybox RewriteRule ^images_ie/?([^/]+)\.(jpe?g|png|gif)$ js/jquery/plugins/fancybox/images/$1.$2 [L] # Dispatcher RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^.*$ %{ENV:REWRITEBASE}index.php [NC,L] </IfModule> ErrorDocument 404 /index.php?controller=404 RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+).html /$3.html [L,R=301]
尝试的错误规则
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+).html /$3.html [L,R=301]
解决方案
问题原因
- 规则位置错误:当前规则放在了
<IfModule mod_rewrite.c>区块之外,而Dispatcher规则(RewriteRule ^.*$ %{ENV:REWRITEBASE}index.php [NC,L])会优先匹配所有请求并转发到首页,导致自定义规则根本不会被执行。 - 正则表达式错误:原规则的分组逻辑完全不符合URL结构,旧URL实际是
/语言码/分类名/产品ID-产品名-EAN.html(3个路径段),但原规则写了5个分组,完全不匹配。
正确规则及配置
将以下规则放在Dispatcher规则之前(即<IfModule mod_rewrite.c>区块内部,# Dispatcher注释上方):
# 重定向旧产品URL到新格式 RewriteRule ^([a-z]{2})/[^/]+/([0-9]+-[^-]+)-[0-9]+\.html$ /$1/$2.html [L,R=301,NC]
规则解释
^([a-z]{2}):匹配2位语言码(如en),捕获为$1/[^/]+/:匹配任意分类名(非斜杠字符),无需捕获([0-9]+-[^-]+):匹配产品ID-产品名部分,捕获为$2-([0-9]+)\.html$:匹配末尾的-EAN.html部分,忽略EAN/ $1/$2.html:重定向到目标格式的URL[L,R=301,NC]:L表示终止后续规则,R=301表示永久重定向,NC表示忽略大小写
注意事项
- 生产环境切换到HTTPS后,可添加条件确保重定向到HTTPS:
RewriteCond %{HTTPS} off RewriteRule ^([a-z]{2})/[^/]+/([0-9]+-[^-]+)-[0-9]+\.html$ https://%{HTTP_HOST}/$1/$2.html [L,R=301,NC]
- 测试阶段建议先用
R=302临时重定向,确认正常后再改为R=301永久重定向,避免浏览器缓存错误规则。
内容的提问来源于stack exchange,提问作者jsf
相关产品推荐
相关产品推荐

