如何通过.htaccess移除URL中的index.php?并实现301重定向
.htaccess 移除URL中的index.php?并实现正确路由
完整规则代码
RewriteEngine On # 重定向旧链接:index.php?/xxx → /xxx RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/index\.php\?/(.*)\sHTTP/ [NC] RewriteRule ^ /%1? [R=301,L,NE] # 移除不带问号的index.php(如index.php/xxx → /xxx) RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] RewriteCond %{REQUEST_URI} !/system/ [NC] RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] # 将非真实文件/目录的请求转发到index.php处理 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php?/$1 [L]
规则说明
- 旧链接重定向:精准匹配
index.php?/开头的查询字符串,提取?/后的路径部分,通过301永久重定向到干净的URL。末尾的?会自动清除原URL的查询参数,确保最终URL不含问号。NE标记防止路径中的特殊字符被不必要编码,L表示执行完这条规则后停止后续匹配。 - 普通index.php移除:保留你原有的规则,处理不带问号的
index.php路径(如example.com/index.php/destinations),确保这类旧链接也能重定向到干净路径,同时排除/system/目录避免影响后台。 - 路由转发:确保用户访问新的干净URL时,服务器能将请求转发到
index.php处理,同时保留完整路径信息。规则排除了真实存在的文件和目录,避免图片、CSS、JS等静态资源被错误转发。
之前尝试规则的问题
你之前的第二条规则没有排除真实文件/目录,会导致静态资源也被转发到index.php引发异常;同时正则匹配HTTP.*$的写法不够严谨,改为HTTP/能兼容不同HTTP版本的请求格式。
内容的提问来源于stack exchange,提问作者Greg Fensterman
相关产品推荐
相关产品推荐

