.htaccess中RewriteRule末尾参数可选时的字符拆分问题
.htaccess 可选最后参数的重写规则修复
你的当前规则存在逻辑问题:/?([0-9a-zA-Z_-]+) 中,斜杠是可选的,且两个捕获组的正则完全一致,导致单个参数请求时,正则引擎会强制拆分字符串,把最后一个字符分配给第二个捕获组,从而出现slug被截断、var错误赋值的情况。
解决方案
可以通过两种方式实现需求:
方法一:拆分两条规则(优先级匹配)
先匹配更具体的带第二个参数的场景,再匹配单个参数的场景:
# 匹配带第二个参数的URL(如 produktas/xxx/yyy) RewriteRule ^produktas/([0-9a-zA-Z_-]+)/([0-9a-zA-Z_-]+)$ /produktas?slug=$1&var=$2 [NC,L] # 匹配仅含单个参数的URL(如 produktas/xxx) RewriteRule ^produktas/([0-9a-zA-Z_-]+)$ /produktas?slug=$1 [NC,L]
方法二:单规则实现可选参数
用非捕获组包裹第二个参数的完整部分(含前置斜杠),并标记为可选,同时允许第二个捕获组为空:
RewriteRule ^produktas/([0-9a-zA-Z_-]+)(?:/([0-9a-zA-Z_-]+))?$ /produktas?slug=$1&var=$2 [NC,L]
效果验证
- 访问
http://site.lt/produktas/the-glass时,$_GET结果为:Array ( [slug] => the-glass [var] => ) - 访问
http://site.lt/produktas/the-glass/blue时,$_GET结果为:Array ( [slug] => the-glass [var] => blue )
内容的提问来源于stack exchange,提问作者Flagmans
相关产品推荐
相关产品推荐

