Классическая ошибка синтаксического анализа ASP, когда страница содержит условные комментарии IE

Кажется, я обнаружил ошибку в том, как ASP обрабатывает условные комментарии IE (или html-комментарии в целом).

Теоретически он вообще не должен их обрабатывать, поскольку они предназначены для клиентской стороны.

На практике ..

<!--[if IE 6]>
<!--include virtual="emptyfile.asp"-->
<![endif]-->

вернется

<![endif]>

Да, вы правильно прочитали.. это удалит открытие комментария, включая все, что есть в файле, и сохранит закрывающий тег комментария..

Это, конечно, испортит html и, конечно, заставит IE выполняться для всех...

есть очевидный обходной путь, такой как использование server.execute для включения вашего файла вместо директивы include, которая будет работать, как и ожидалось.

Скорее всего, он путает окончание --> директивы include с началом <!-- html-комментария. Но он вообще не должен заморачиваться с html-комментариями..

Есть ли известная причина, по которой это происходит таким образом? или это просто баг?


person Community    schedule 31.01.2010    source источник
comment
Я не рассматривал это как вопрос программирования сам по себе.   -  person Gabriele Petrioli    schedule 01.02.2010


Ответы (2)


Это не ошибка.

Синтаксис включения asp предполагает найти ключевое слово #include в комментарии разметки. Однако это не требует, чтобы от конца последовательности начала комментария до ключевого слова #include оставался только пробел. Следовательно, это вполне законно: -

 <!-- pink elephants #include virtual="myinc.asp" -->

Это также законно: -

 <!--
 #include virtual="myinc.asp"
 -->

Теперь любое последующее появление <!-- внутри комментария обрабатывается так же, как и любой другой текст. Следовательно, это все еще законно: -

<!--
<!-- #include virtual="myinc.asp" -->

Это первый <!--, с которого начинается комментарий, который рассматривается ASP как маркер включения. Второй - просто игнорируемый текст. Весь комментарий заменяется содержимым файла «myinc.asp». Если файл оказывается пустым, то комментарий просто удаляется.

Теперь дополнительный [if IE 6]> по-прежнему просто игнорируется текстом, поэтому весь [if IE 6>\r\n<!-- будет игнорироваться текстом. Таким образом:-

<!--[if IE 6>
<!-- #include virtual="emptyfile.asp" -->

Заменяется содержимым «emptyfile.asp». Любые последующие: -

<![endif]-->

Отправляется дословно.

person Community    schedule 31.01.2010
comment
+1 Спасибо за подтверждение того, что я подозревал, и за подробности! Это имеет смысл. - person Gabriele Petrioli; 01.02.2010

Если вы тестируете в IE 8, то <![endif]--> будет <![endif]>,

пожалуйста, проверьте эту ссылку http://msdn.microsoft.com/en-us/library/ms537512%28VS.85%29.aspx

условные комментарии для разных версий IE.

person Community    schedule 31.01.2010
comment
На самом деле проблема возникает во всех браузерах.. так как это неправильное поведение сервера, а не клиента.. - person Gabriele Petrioli; 31.01.2010