Content-type text-plain заставляет браузер загружать файл

Я пишу API веб-приложений, где, когда кто-то обращается к URL-адресу, он возвращает текстовые данные. Я задал тип содержимого "text/plain", но когда я обращаюсь к нему с Chrome, он загружает файл, содержащий эту информацию, вместо отображения. Когда я обращаюсь к нему с IE, он отображается правильно, и когда я обращаюсь к Firefox, он говорит, что он пытается получить доступ к приложению/октету-потоку и спрашивает, хочу ли я загрузить файл.

Я записал то, что было возвращено веб-сервером с помощью TinyHTTPProxy, и оно выглядит следующим образом:

[2012-03-11 16:51:45.345] INFO     {TinyHTTPProxy Thread-4} HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: close
Date: Mon, 05 Mar 2012 09:49:54 GMT
Server: localhost


[2012-03-11 16:51:45.345] INFO     {TinyHTTPProxy Thread-4} 10b
P,FIO,7,31.5900,0.,,0,100,0,0,30.7600,31.9600,100,1000,,,0.,16:03:14t,,0,31.5900    ,1.2,,,15,n,,,,,03/09/2012,,31.2200,,,,-0.37,-0.37,0.274456994,,,,,0,,2846732.85    ,14,4,,3989502,BSE-CSE-NYSE-PSE-NMS,,,,,0,,,0,1155872,N,,26,26,26,16:03:14,5-7-10-11-12-13-18-25-26-28-80,0

Если я изменил тип контента на "application-json", он отобразится во всех браузерах. Кроме того, если я изменяю тип содержимого на "text/html", он также работает, хотя я не возвращаю HTML файл.

Есть ли объяснение, почему text/plain ведет себя таким образом? Я проверил, чтобы все возвращаемые данные были фактически ASCII, и поскольку я устанавливаю тип контента как текстовый/обычный, я смущен, почему он интерпретируется как application/octet-stream.

Ответ 1

Похоже, вы столкнулись с проблемой Chrome 106150. Chrome, по-видимому (иногда) решает использовать логику "сниффинга", когда тип контента - text/plain.

Возможные обходные пути:

  • Отправьте заголовок X-Content-Type-Options: nosniff.
  • Если текст Unicode, включите спецификацию. Это скажет логике обнюхивания, что это действительно текст.
  • Удалите "двоичные" байты из файла. Из отчета об ошибке "Любое значение между 0x00 и 0x1f выглядит двоичным, за исключением ESC, CR, NP, NL, HT".
  • Похоже, использование расширения, которое, очевидно, должно быть text/plain (например,.txt), может отключить сниффинг.

Ответ 2

Лоуренс объясняет правильность. Только IE и Chrome выполняют показ мимики во время этого сообщения. Теперь вы можете просто установить HTTP-заголовок X-Content-Type-Options: nosniff, и он будет делать трюк!