You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:.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]

关键修改点

  1. 精准匹配路径:^admin(/)?$只匹配/admin或/admin/,不会匹配/admin/index.php这类子路径,彻底避免循环。
  2. 前置文件/目录检查:先判断请求的资源是否实际存在,存在则直接访问,不执行后续重写规则,这是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:09:24