Откуда берутся эти дополнительные HTTP-заголовки?

Когда я просто отгоняю что-то из php файла, я не отправляю заголовки намеренно, однако - есть какие-то заголовки по умолчанию, присутствующие в любом случае, когда я смотрю ответ firebug:

заголовки ответов:

HTTP/1.1 200 OK
Сервер: nginx
Дата: чт, 23 Июн. 2011 19:33:51 GMT
Content-Type: text/html
Передача-кодирование: chunked
Подключение: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.3.6-6 ~ dotdeb.1
Истекает: Чт, 19 ноября 1981 г. 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check = 0, pre-check = 0
Pragma: no-cache
Content-Encoding: gzip

Мне любопытно - это заголовки ответов по умолчанию, установленные сервером (nginx) или PHP?

Ответ 1

Я считаю, что это комбинация обоих... Вы можете сказать, что "X-Powered-By: PHP/5.3.6-6 ~ dotdeb.1" поступает из PHP, а "Server: nginx" - из NGINX.

Вы можете изменить заголовки в PHP следующим образом:

<?php
    header("HTTP/1.0 404 Not Found");
?>

Заголовок gzip наиболее определенно происходит от NGINX, поскольку он сжимает вывод (html) в браузере. PHP может "добавлять" в заголовки, вызывая функцию, подобную той, что указана выше. Затем сервер объединяет его с заголовками PHP и обслуживает запрос.

В зависимости от вашего сервера зависит, имеют ли заголовки PHP приоритет над заголовками сервера.

Надеюсь, что это поможет.

Ответ 2

Большинство устанавливаются nginx, например Server, Date, Content-Encoding и Connection. Тем не менее, некоторые другие заголовки заданы PHP, и вы можете добавить других в PHP, как этот header("Name: Value");

Ответ 3

Заголовок X-Powered-By управляется значением директивы expose_php в php.ini:

Решает, может ли PHP раскрывать тот факт, что он установлен на сервере (например, добавив свою подпись в заголовок веб-сервера). Это никак не угроза безопасности, но это позволяет определить, используете ли вы PHP на своем сервере или нет.

Ответ 4

Большинство заголовков отправляются nginx. Чтобы перечислить заголовки, отправленные PHP, используйте функцию headers_list:

<?php
echo htmlentities(print_R(headers_list(), true));
?>

Ответ 5

PHP автоматически устанавливает некоторые из них, например Content-Type: text/html для мировой страницы приветствия. nginx устанавливает те, которые связаны с сокетом, например Connection: keep-alive.

Вы найдете настройки для соединений в конфигурации nginx. По содержанию, это PHP. Вы можете переопределить некоторые из них с помощью функции header() в PHP, а также добавить свои собственные пользовательские заголовки. http://php.net/manual/en/function.header.php

Например, вы можете установить Content-Type в application/json, если вы планируете отправлять PHP строку JSON.

Ответ 6

Вы также можете перезаписать любой из заголовков сервера по умолчанию, используя функцию header(). Например, если вы включите в свой PHP header('Server: '), это будет reset заголовок Server: Пусто.

Ответ 7

Что еще не хватает в ответах, так это роль PHP:

Некоторые заголовки действительно заданы самим PHP, но причина не так просто найти. Это объяснение поведения ограничителя кеша по умолчанию, описанное здесь: http://www.php.net/manual/en/function.session-cache-limiter.php

Какой афаик не в документах - как отключить их полностью - просто передайте ему значение undefined:

session_cache_limiter(false);

Вы должны сделать это, прежде чем начать сеанс. Если вы используете Zend Framework, вы должны установить это перед вашими приложениями bootstrap() - иначе это не сработает.