如何修改.htaccess规则将URL多余路径段转为params参数数组
解决方案
你可以通过添加递归重写规则实现不定长度路径参数转params[]数组的需求,以下是完整修改后的.htaccess配置:
# Turn rewrite engine on Options +FollowSymlinks RewriteEngine on # 递归拆分额外路径段为params[]参数 RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/(.*)/([a-zA-Z0-9]+)$ $1/$2/$3?params[]=$4 [QSA,N] # 匹配控制器+动作+1个额外参数的最终规则 RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$ index.php?controller=$1&action=$2¶ms[]=$3 [QSA,L] # 原有规则(保持兼容) RewriteRule "^([a-zA-Z0-9]+)$" "index.php?controller=$1&action=" [QSA,L] RewriteRule "^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$" "index.php?controller=$1&action=$2" [QSA,L]
规则说明
- 第一条新增规则使用
N(Next)标志,每次匹配到控制器/动作/路径1/路径2/.../路径N结构时,会把最后一段路径拆分添加为params[]参数,然后重新从第一条规则开始执行,直到路径只剩控制器/动作/单段参数结构 - 第二条新增规则处理最终只剩1个额外参数的情况,直接重写到目标
index.php - 原有规则保持不变,兼容无额外参数、只有控制器的场景
- 所有规则保留
QSA标志,会自动合并URL上自带的其他查询参数 - 如果你的控制器、动作、参数名允许下划线、横杠等特殊字符,可以自行调整正则中的
[a-zA-Z0-9]匹配范围,比如改成[a-zA-Z0-9_-]
效果验证
访问www.example.com/api/foo/bar/some/dummy/variables时,会被重写为:www.example.com/api/index.php?controller=foo&action=bar¶ms[]=some¶ms[]=dummy¶ms[]=variables
内容的提问来源于stack exchange,提问作者PlayWolfYT
相关产品推荐
相关产品推荐

