当页面包含IE条件注释时,经典ASP解析错误

Gab*_*oli 7 asp-classic

我想我已经确定了ASP处理IE条件评论(或一般的html评论)的方式中的一个错误.

理论上它根本不应该处理它们,因为它们是为客户端而设计的.

在实践中 ..

<!--[if IE 6]>
<!--include virtual="emptyfile.asp"-->
<![endif]-->
Run Code Online (Sandbox Code Playgroud)

将返回

<![endif]>
Run Code Online (Sandbox Code Playgroud)

是的,你读得正确..它将删除评论的开头包括文件中的任何内容并保留结束评论标签..

这个'''''''''''''''''''''''''''''''''''''''''''''''''''''

有明显的解决方法,例如使用server.execute包含您的文件而不是include指令,它将按预期工作.

很可能它将-->include指令的结尾与<!--html注释的开头混淆了.. 但它根本不应该打扰html注释.

知道这种情况发生的原因是什么?还是只是一个bug?

Ant*_*nes 4

这不是一个错误。

#includeasp include 语法期望在标记注释中找到关键字。但是,它并不要求从注释开始序列末尾到#include关键字之间只有空格。因此这是相当合法的:-

 <!-- pink elephants #include virtual="myinc.asp" -->
Run Code Online (Sandbox Code Playgroud)

这也是合法的:-

 <!--
 #include virtual="myinc.asp"
 -->
Run Code Online (Sandbox Code Playgroud)

现在,注释中随后出现的任何内容<!--都会像任何其他文本一样被处理。因此这仍然是合法的:-

<!--
<!-- #include virtual="myinc.asp" -->
Run Code Online (Sandbox Code Playgroud)

这是第一个<!--开始注释的部分,被 ASP 视为包含标记。第二个只是被忽略的文本。整个注释被“myinc.asp”文件的内容替换。如果文件恰好为空,则注释将被简单删除。

现在,额外的[if IE 6]>内容仍然只是被忽略的文本,因此整个[if IE 6>\r\n<!--文本将被忽略。因此:-

<!--[if IE 6>
<!-- #include virtual="emptyfile.asp" -->
Run Code Online (Sandbox Code Playgroud)

被“emptyfile.asp”的内容替换。任何后续:-

<![endif]-->
Run Code Online (Sandbox Code Playgroud)

逐字发送。