这些额外的HTTP标头来自哪里?

时间:2011-06-23 20:10:40

标签: php http http-headers nginx

当我简单地回复php文件中的内容时,我并没有故意发送任何标题,但是当我查看firebug响应时,无论如何都会出现一些默认标题:

响应标题:

  

HTTP / 1.1 200 OK
  服务器:nginx
  日期:2011年6月23日星期四19:33:51 GMT
  内容类型:text / html
  转移编码:分块
  连接:保持活力
  变化:接受编码
  X-Powered-By:PHP / 5.3.6-6~dotdeb.1
  到期日:1981年11月19日星期四08:52:00格林尼治标准时间   缓存控制:无存储,无缓存,必须重新验证,后检查= 0,预检查= 0   Pragma:no-cache
  内容编码:gzip

我很好奇 - 这些默认响应标头是由服务器(nginx)还是由PHP设置的?

7 个答案:

答案 0 :(得分:7)

我相信它是两者的结合......你可以说“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标头是否优先于服务器标头。

希望这有帮助。

答案 1 :(得分:3)

大多数是由nginx设置的,例如Server,Date,Content-Encoding和Connection。但是,其他一些标头是由PHP设置的,您可以像PHP header("Name: Value");

一样在PHP中添加其他标头

答案 2 :(得分:2)

X-Powered-By标头由php.ini中expose_php指令的值控制:

  

决定PHP是否可以公开它安装在服务器上的事实(例如,通过将其签名添加到Web服务器头)。它不是任何安全威胁,但它可以确定您是否在服务器上使用PHP。

答案 3 :(得分:2)

大多数标头都是由nginx发送的。要列出PHP发送的标题(使用),请使用函数headers_list

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

答案 4 :(得分:2)

PHP会自动设置其中一些内容,例如Content-Type: text/html用于hello world页面。 nginx设置与套接字有关的内容,如Connection: keep-alive

您可以在nginx的配置中找到连接的设置。内容方面,它是PHP。您可以使用PHP中的header()函数覆盖其中的一些,并添加您自己的自定义标头。 http://php.net/manual/en/function.header.php

例如,如果您计划让PHP发送JSON字符串,则可以将Content-Type设置为application/json

答案 5 :(得分:1)

您还可以使用header()功能覆盖任何默认服务器标头。例如,如果您在PHP header('Server: ')中包含此项,则会将Server:标头重置为空白。

答案 6 :(得分:1)

答案中仍然缺少的是PHP的作用:

某些标题确实是由PHP本身设置的,但原因并不容易找到。这是此处解释的默认会话缓存分隔符行为:http://www.php.net/manual/en/function.session-cache-limiter.php

文档中没有的是如何完全关闭它们 - 只需将一些未定义的值传递给它:

session_cache_limiter(false);

您必须在开始会话之前执行此操作。如果您使用的是Zend Framework,则必须在应用程序bootstrap()之前设置它 - 否则它将无法工作。