ASP Classic中查询字符串以&开头的异常行为及IIS配置咨询
解决ASP Classic在IIS 10.0中解析开头带&的查询字符串异常问题
这个问题我之前也碰到过,本质是ASP Classic本身的查询字符串解析逻辑导致的——它会把?之后的第一个字符直接作为参数名的起始,所以当你传入?&var1=value1&var2=value2时,它不会跳过开头的&,反而把&var1当成了完整的参数名,这就出现了你看到的异常输出。
遗憾的是,没有直接的IIS配置项能修改ASP Classic的这个解析行为,因为这个规则是ASP Classic引擎内部的处理逻辑,不属于IIS的请求解析或URL重写的默认配置范畴。不过我们有几个可行的解决办法:
方法1:代码层面预处理查询字符串
你可以手动处理原始的查询字符串,提前去掉开头的&,再进行解析:
Dim rawQuery, processedQuery, params, param, keyValue rawQuery = Request.ServerVariables("QUERY_STRING") ' 去掉开头的&(如果存在) If Left(rawQuery, 1) = "&" Then processedQuery = Mid(rawQuery, 2) Else processedQuery = rawQuery End If ' 手动解析处理后的查询字符串 params = Split(processedQuery, "&") For Each param In params keyValue = Split(param, "=") If UBound(keyValue) >= 1 Then Response.Write Server.URLEncode(keyValue(0)) & ": " & Server.URLEncode(keyValue(1)) & "<br/>" End If Next
如果不想完全手动解析,也可以在遍历Request.QueryString时修正参数名:
For Each Item in Request.QueryString Dim actualKey ' 去掉参数名开头的& actualKey = IIf(Left(Item, 1) = "&", Mid(Item, 2), Item) Response.Write actualKey & ": " & Request.QueryString(Item) & "<br/>" Next
方法2:用IIS URL重写模块预处理请求
如果你不想修改代码,可以通过IIS的URL重写规则,自动把开头带&的查询字符串转换成正常格式。在站点的web.config中添加以下规则:
<rewrite> <rules> <rule name="Remove leading & from query string" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{QUERY_STRING}" pattern="^&(.*)" /> </conditions> <!-- 用Rewrite实现内部重写(地址栏不变),用Redirect实现地址栏跳转 --> <action type="Rewrite" url="{R:0}?{C:1}" /> </rule> </rules> </rewrite>
这个规则会自动检测查询字符串是否以&开头,如果是,就内部重写(或重定向)到去掉第一个&的URL,这样ASP Classic就能正常解析参数了。
补充一点:ASP Classic的这个行为属于老旧设计,早期的URL规范虽然允许?后直接跟&,但ASP Classic的解析逻辑没有适配这种场景。如果有可能,最好还是从前端避免生成这种开头带&的URL,这是最彻底的解决方式。
内容的提问来源于stack exchange,提问作者Niloct
相关产品推荐
相关产品推荐

