.htaccess RewriteRule匹配参数末尾多余斜杠如何解决
重写规则修改方案
问题原因
原规则中使用的贪婪匹配(.+)会优先尽可能多的捕获字符,末尾可选的/?匹配优先级更低,所以当URL末尾带斜杠时,斜杠会被前面的捕获组捕获,最终导致参数末尾携带多余斜杠。
修改后的.htaccess配置
RewriteEngine On RewriteRule ^([^/]+)/([^/]+)/?$ index.php?book=$1&chapter=$2 [NC,L,QSA] RewriteRule ^([^/]+)/?$ index.php?book=$1 [NC,L,QSA]
规则说明
将原规则中的.+替换为[^/]+:
[^/]代表匹配除路径分隔符斜杠之外的所有字符+代表至少匹配1个有效字符
这样每一段捕获的内容只会包含对应路径段的有效内容,不会包含斜杠,末尾可选的/?仅匹配路径末尾可能存在的单个斜杠,不会被捕获到参数中。同时规则保留了QSA标记,原URL携带的查询参数会自动合并到重写后的参数列表中,不会丢失。
效果验证
修改规则后所有访问场景都能得到预期参数:
- 访问
mydomain.com/coding/mysql/,参数为Array ( [book] => coding [chapter] => mysql ) - 访问
mydomain.com/coding/mysql/?contactId=333&UTM=aff,参数为Array ( [book] => coding [chapter] => mysql [contactId] => 333 [UTM] => aff ) - 访问
mydomain.com/coding/?contactId=333,参数为Array ( [book] => coding [contactId] => 333 )
内容的提问来源于stack exchange,提问作者scully
相关产品推荐
相关产品推荐

