.htaccess RewriteRule异常:混合格式URL可被匹配的问题求助
这事儿其实是正则表达式的匹配逻辑在搞鬼,咱们一步步拆解清楚:
你的第一条重写规则是:
RewriteRule ^library-(.*)\.aspx$ index.php?page=library&image=$1 [NC,L,QSA]
这里的核心问题出在(.*)这个正则片段上——正则里的.*是贪婪匹配模式,它会匹配任意字符(包括路径分隔符/),直到碰到规则末尾的\.aspx$锚点。
当用户访问https://example.com/library-image5000.aspx/information-sometext.aspx时,整个请求的路径是library-image5000.aspx/information-sometext.aspx,这个路径刚好满足“以library-开头、以.aspx结尾”的条件。于是(.*)会一口气匹配到image5000.aspx/information-sometext,触发规则把请求转发到index.php?page=library&image=image5000.aspx/information-sometext,这就是为什么混合URL会被“接受”。
怎么修复这个问题?
你需要限制匹配范围,让(.*)只匹配/之外的字符,把规则里的(.*)改成([^/]*)——[^/]表示匹配除了/以外的任意单个字符,*表示匹配零次或多次。修改后的完整规则应该是:
RewriteEngine On # 限制image参数不包含路径分隔符/ RewriteRule ^library-([^/]*)\.aspx$ index.php?page=library&image=$1 [NC,L,QSA] # 同样修复text参数的匹配,顺便补上第二条规则缺失的空格(之前flag前没空格会导致参数值错误) RewriteRule ^information-([^/]*)\.aspx$ index.php?page=information&text=$1 [NC,L,QSA]
这样修改后,只有当URL路径是纯library-xxx.aspx或者information-xxx.aspx(中间没有/)时才会被匹配,像library-image5000.aspx/information-sometext.aspx这种带额外路径段的URL就不会触发规则了。
另外补充个小细节:你原来的第二条规则里$1[NC,L,QSA]少了一个空格,这会导致[NC,L,QSA]被当成text参数的一部分,引发参数值错误,上面的修复版本已经补上了这个空格。
内容的提问来源于stack exchange,提问作者Anass

