求助:.htaccess重写规则无法正确跳转admin目录问题
解决.htaccess Rewrite循环跳转问题
你的循环跳转问题核心在于admin规则的匹配范围过宽,导致重写后的请求会再次触发规则,陷入无限循环。
问题分析
你当前的规则:
RewriteCond %{QUERY_STRING} ^$ RewriteRule ^admin admin/index.php [QSD,L]
^admin会匹配所有以admin开头的路径,包括重写后的/admin/index.php(路径开头是admin)。每次重写后,服务器会再次执行规则,不断把/admin/index.php重写成/admin/index.php/index.php,最终形成你看到的超长错误链接。
修正方案
调整admin规则为精准匹配根路径的/admin或/admin/,同时增加文件/目录存在性检查,避免重写实际存在的资源:
RewriteEngine On # 传递HTTP_AUTHORIZATION头到后端 RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 如果请求的是实际存在的文件或目录,直接访问,跳过后续重写 RewriteCond %{REQUEST_FILENAME} -F [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 精准匹配/admin或/admin/,重写到admin/index.php RewriteCond %{QUERY_STRING} ^$ RewriteRule ^admin(/)?$ admin/index.php [QSD,L] # 其他无查询字符串的请求,重写到public/index.php RewriteCond %{QUERY_STRING} ^$ RewriteRule ^ public/index.php [QSD,L]
关键修改点
- 精准匹配路径:
^admin(/)?$只匹配/admin或/admin/,不会匹配/admin/index.php这类子路径,彻底避免循环。 - 前置文件/目录检查:先判断请求的资源是否实际存在,存在则直接访问,不执行后续重写规则,这是Rewrite规则的通用最佳实践。
如果需要让/admin下的所有子路径(比如/admin/login)都重写到admin/index.php,可以把admin规则改成:
RewriteCond %{QUERY_STRING} ^$ RewriteRule ^admin/(.*)$ admin/index.php?path=$1 [QSD,L]
这样会把/admin/login的路径参数传递给admin/index.php,方便后端处理路由。
内容的提问来源于stack exchange,提问作者Budimir Skrtic
相关产品推荐
相关产品推荐

