Как отправить браузер на страницу с ошибкой, если часть ответа была отправлена ​​(chunked)

Это типичный сценарий: страница оценивается, а там буфер - после заполнения буфера часть страницы, которая оценивается, отправляется в браузер. Это использует кодировку HTTP 1.1 chunked.

Однако ошибка может возникать в одном из блоков (после того, как первый уже отправлен). В этом случае:

  • вы не можете перенаправить (отправить заголовок Location), поскольку заголовки и статус ответа уже отправлены
  • вы не можете выполнять перенаправление на стороне сервера (вперед), потому что новая страница должна быть отображена после части, которая уже отправлена ​​- это будет выглядеть безобразно.

Итак, что вы должны делать в этом случае? я задал вопрос, можете ли вы отправить заголовок местоположения в трейлере, но это низкоуровневый http, а абстракция языков может не позволить его, даже если он (и, вероятно, не поддерживается в браузерах)

Другой вариант - отправить <script>window.href.location="errorPage"</script> и, таким образом, заставить клиента перенаправить, но это уродливо. Кроме того, вы должны положить </script>, чтобы закрыть любой потенциальный незакрытый тег <script> на частичной странице.

(Я отмечаю основные веб-языки/рамки, потому что это универсальная проблема)

Ответ 1

Вы не можете переадресовывать с сервера в закодированную кодировку, потому что заголовки уже отправлены. Единственный способ выполнить перенаправление - отправить тег <script> с сервера и выполнить перенаправление на стороне клиента. Просто из любопытства вы пытаетесь внедрить сервер COMET? Если это так, HTML5 WebSockets выглядит лучше (если браузеры, на которые вы ориентируетесь, поддерживают их, конечно) по сравнению с скрытой технологией iframe.