Заголовок ('Content-Type: text / plain'); нужно вообще? - PullRequest
56 голосов
/ 12 сентября 2009

Я не видел никакой разницы с или без этой информации о голове.

Ответы [ 6 ]

102 голосов
/ 12 сентября 2009

Определите «необходимо».

Это необходимо, если вы хотите, чтобы браузер знал , какой тип файла. PHP автоматически устанавливает заголовок Content-Type на text/html, если вы не переопределите его, поэтому ваш браузер обрабатывает его как файл HTML, который не содержит HTML. Если бы ваш вывод содержал какой-либо HTML, вы бы увидели совсем другие результаты. Если вы должны были отправить:

<b><i>test</i></b>

a Content-Type: text/html выведет:

тест

, тогда как Content-Type: text/plain выведет:

<b><i>test</i></b>

Версия TLDR: Если вы действительно выводите только текст, это не имеет значения, но это IS неправильно.

48 голосов
/ 12 сентября 2009

PHP по умолчанию использует Content-Type "text / html" - который очень похож на "text / plain" - и это объясняет, почему вы не видите никаких отличий. text / plain необходим, если вы хотите выводить текст как есть (включая символы <> -). Примеры:

header("Content-Type: text/plain");
echo "<b>hello world</b>";
// Output: <b>hello world</b>

header("Content-Type: text/html");
echo "<b>hello world</b>";
// Output: hello world
11 голосов
/ 04 ноября 2016

Очень важно сообщить браузеру, какой тип данных вы отправляете. Разница должна быть очевидной. Попробуйте просмотреть в браузере вывод следующего PHP-файла:

<?php
header('Content-Type:text/html');
?>
<p>Hello</p>

Вы увидите:

привет

(обратите внимание, что вы получите те же результаты, если пропустите строку заголовка в этом случае - text / html по умолчанию в php)

Измените его на текстовый / обычный

<?php
header('Content-Type:text/plain');
?>
<p>Hello</p>

Вы увидите:

Hello

Почему это имеет значение? Если у вас есть что-то вроде следующего в php-скрипте, который, например, используется ajax-запросом:

<?php
header('Content-Type:text/html');
print "Your name is " . $_GET['name']

Кто-то может разместить ссылку на URL-адрес, например http://example.com/test.php?name=%3Cscript%20src=%22http://example.com/eviljs%22%3E%3C/script%3E, на своем сайте, и, если пользователь щелкнет по нему, он предоставит всю свою информацию на вашем сайте тому, кто разместит ссылку. Если вы используете файл как текст / обычный текст, вы в безопасности.

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

7 голосов
/ 12 сентября 2009

Установка заголовка Content-Type повлияет на то, как веб-браузер обрабатывает ваш контент. Когда большинство основных веб-браузеров сталкиваются с типом содержимого text / plain, они отображают исходный текстовый источник в окне браузера (в отличие от источника, отображаемого в HTML). Это разница между видением

<b>foo</b>

или

Foo

Кроме того, при использовании объекта XMLHttpRequest заголовок Content-Type будет влиять на сериализацию возвращаемых результатов браузером. До принятия AJAX-фреймворков, таких как jQuery и Prototype, распространенной проблемой ответов AJAX был Content-Type, установленный в text / html вместо text / xml. Подобные проблемы могут возникнуть, если Content-Type был text / plain.

1 голос
/ 03 августа 2015

Скажем, вы хотите ответить на запрос с HTTP-статусом 204: Нет содержимого. Firefox будет жаловаться, что «элемент не найден» в консоли браузера. Это ошибка в Firefox, о которой сообщалось, но она не исправлялась в течение нескольких лет. Отправив заголовок «Content-type: text / plain», вы можете предотвратить эту ошибку в Firefox.

0 голосов
/ 12 сентября 2009

нет, это не так, вот пример поддержки моего ответа ----> четкая разница видна, когда вы переходите на сжатие HTTP, которое позволяет сжимать данные во время перемещения с сервера на клиент и Тип этих данных автоматически становится «gzip», который сообщает браузеру, что bowser получил zip-данные , и он должен upzip , это пример, где Type действительно важен для Bowser.

...