如何通过.htaccess将CodeIgniter站点URL转换为html后缀结构?
解决CodeIgniter站点URL转换的.htaccess配置方案
根据你的需求,需要实现新站点URL与旧版.html格式URL的转换,以下分两种常见场景给出配置方案,你可根据实际需求选择:
场景1:让旧版.htmlURL指向新站点内容
当用户访问旧格式URL(如www.mydomain.com/productname.html)时,内部重写到新站点的/lang/product/productname路由,用户地址栏保持旧URL不变:
在现有.htaccess的强制www规则之后,添加以下规则:
# 匹配旧版.html URL,内部重写到新路由 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^.]+)\.html$ /lang/product/$1 [L]
场景2:将新站点路由重定向为旧版.htmlURL
当用户访问新站点路由(如www.mydomain.com/lang/product/productname)时,浏览器地址栏301重定向到旧格式URL(利于SEO权重继承):
在现有.htaccess的强制www规则之后,添加以下规则:
# 将新路由301重定向到旧版.html URL(匹配两位语言码,如en/zh) RewriteCond %{REQUEST_URI} ^/([a-z]{2})/product/([^/]+)$ [NC] RewriteRule ^ /%2.html [R=301,L]
完整整合后的.htaccess代码
以场景1为例,整合后的完整配置如下:
RewriteEngine On # 强制跳转到www域名 RewriteCond %{HTTP_HOST} !="" RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # 场景1:旧.html URL重写到新路由(按需替换为场景2的规则) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^.]+)\.html$ /lang/product/$1 [L] # 处理system目录请求 RewriteCond %{REQUEST_URI} ^/system.* RewriteRule ^(.*)$ index.php?/$1 [L] # 非文件/目录的请求转发到index.php(CodeIgniter核心规则) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)$ index.php?/$1 [L] # 移除URL尾部斜杠 RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R]
注意事项
- 规则顺序很重要:强制www的规则必须放在最前面,URL转换规则要放在CodeIgniter核心转发规则之前;
- 如果你的语言码不是两位,需修改场景2规则中的
([a-z]{2})为对应匹配规则; - 测试前建议先用
R=302临时重定向验证,确认无误后再改为R=301永久重定向; - 确保服务器开启了
mod_rewrite模块。
内容的提问来源于stack exchange,提问作者Melik BOZKURT
相关产品推荐
相关产品推荐

