.htaccess非/eng/路径重定向至/eng/ 解决循环问题(本地+线上)
重定向循环问题修复方案(适配本地/线上)
问题根源
循环是因为外部请求被重定向到/eng/路径后,内部重写规则又将其转成不带/eng/的路径,而这个内部转换后的请求会再次触发重定向规则,形成死循环:
- 外部请求
/ecom-book/genre.php→ 重定向到/ecom-book/eng/genre.php - 服务器发现
/ecom-book/eng/genre.php不存在,内部重写为/ecom-book/genre.php - 重定向规则再次匹配这个内部请求,循环重复
修复后的完整.htaccess代码
RewriteEngine on # 静态资源直接放行,不参与重定向 RewriteCond %{THE_REQUEST} !\.(css|js|jpg|jpeg|png|gif)$ [NC] # 仅对浏览器发送的原始请求中不带/eng/的路径执行301重定向 RewriteCond %{THE_REQUEST} ^GET\ /ecom-book/(?!eng/)(.*)\ HTTP RewriteRule ^ecom-book/(.*)$ /ecom-book/eng/$1 [R=301,L,NC] # 内部重写:当/eng/下的路径不是实际文件/目录时,映射到ecom-book根目录对应文件 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ecom-book/eng/(.*)$ /ecom-book/$1 [L,QSA] # 产品URL美化规则(适配子目录结构) RewriteRule ^ecom-book/product/(.*)/(.*)$ /ecom-book/product.php?id=$1&name=$2 [L,QSA] # 错误页面配置(保留原设置) ErrorDocument 403 /cgi-sys/403_def.html ErrorDocument 404 /cgi-sys/404_def.html ErrorDocument 500 /cgi-sys/500_def.html ErrorDocument 502 /cgi-sys/502_def.html ErrorDocument 503 /cgi-sys/503_def.html ErrorDocument 504 /cgi-sys/504_def.html # HTTPS强制跳转(保留原设置) RewriteCond %{HTTPS} off RewriteCond %{HTTP:X-Forwarded-SSL} !on RewriteCond %{HTTP_HOST} ^example\.in$ [OR] RewriteCond %{HTTP_HOST} ^www\.example\.in$ RewriteRule ^/?$ "https\:\/\/example\.in\/" [R=301,L] <IfModule mime_module> AddHandler application/x-httpd-ea-php81___lsphp .php .php8 .phtml </IfModule> # php -- END cPanel-generated handler, do not edit
关键修改说明
- 避免循环核心:用
%{THE_REQUEST}(浏览器原始请求,不受内部重写影响)替代%{REQUEST_URI}判断重定向条件,确保仅对外部请求执行重定向,内部重写后的请求不会触发规则 - 路径匹配修正:内部重写规则添加
ecom-book/前缀,确保子目录下路径映射准确 - 兼容性优化:添加
NC标记忽略大小写,覆盖更多请求场景
本地/线上适配调整
- 本地环境(localhost/ecom-book):无需修改,规则中的
/ecom-book/前缀自动匹配本地子目录 - 线上环境(若ecom-book为网站根目录):移除所有规则中的
/ecom-book/前缀,例如将RewriteRule ^ecom-book/(.*)$ /ecom-book/eng/$1改为RewriteRule ^(.*)$ /eng/$1
内容的提问来源于stack exchange,提问作者Aritra
相关产品推荐
相关产品推荐

