Откуда берутся эти дополнительные 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() - иначе это не сработает.