【问题标题】:How does PHP set HTTP headers with the header() function?PHP 如何使用 header() 函数设置 HTTP 标头?
【发布时间】:2016-05-06 14:23:47
【问题描述】:

我正在学习 HTTP 和 Web 编程,我惊讶地发现您可以使用 php 设置 HTTP 标头。我认为 PHP 用于生成动态 HTML 网页和创建应用程序。 PHP 可以设置由 Web 服务器(例如 Apache)发送的标头,这对我来说似乎很奇怪。我知道 PHP 解释器读取 PHP 文件并通常以 HTML 的形式生成输出。

此过程是否适用于管道?在我看来,apache 服务器必须能够接收来自 PHP 解释器的命令,或者它必须能够解释 PHP 函数本身。我认为它们是独立的过程。

PHP 使用什么机制为 Web 服务器应用程序(httpd 或 Apache 或其他)设置标头

是否所有 Web 服务器都支持接收和设置通过 PHP 接收的标头?

是否可以为所有后端语言设置 HTTP 标头?

我搜索了该网站,但没有找到我的问题的答案。

更具体地说,我想知道 apache 或其他 web 服务器可以向 PHP.exe 应用程序或 PHP-CGI.exe 应用程序发送什么命令来接收除了输出的 HTML 文件之外的其他信息。

【问题讨论】:

  • Apache2 通常设置有一个 PHP 模块 - libapache2-mod-php5 - 这可能是它可能的原因。
  • @Antony D'Andrea 这是否意味着 apache 和 PHP 在同一个进程中运行? PHP解释器不是在操作系统中运行的一个单独的进程吗?
  • 我不明白,真的有那么令人惊讶吗?如果 PHP 可以基于 .php 文件中的一些指令生成动态内容,即使网络服务器仍然是提供内容的服务器,为什么它不能设置标头?哦,PHP 解释器不是一个单独的进程,它就像一个网络服务器调用的额外二进制包。
  • 标头被发送到浏览器,它们也必须在 Apache 开始重新调整网页的任何部分之前发送,因为标头必须在任何实际页面内容之前首先到达浏览器
  • 请记住,当 Apache 看到 <php 标记时,整个页面将被发送到 PHP 进行解释和执行。一旦 PHP 完成向页面添加内容 PHP 传递完成的页面将传递回 Apache,以便它可以将其传递给浏览器

标签: php apache http http-headers backend


【解决方案1】:

确实是一个有趣的问题。使用命令行工具,我只能访问生成的 HTML 输出。因此php -r"header('Location: http://someurl.com');" 不会从命令行产生任何结果。

不过,当我使用 IIS(不是 Apache)查看我的设置时,我发现 IIS 正在使用 PHP-CGI.exe 与 PHP 进行通信。查看 PHP-CGI.exe 的可选参数,我看到-b 可用于设置Bind Path for external FASTCGI Server mode。我猜在这种服务器模式下,将有空间将标头信息与生成的 HTML 分开。

我不知道更深入的 FASTCGI 协议的确切细节。但我想这就是你想知道的。

编辑:

当我在谷歌上搜索这个时,我遇到了这个线程: How does PHP interface with Apache?

【讨论】:

  • 感谢您理解我的问题并花时间回答。我仍然会等待,看看是否有人可以给出更深入的答案
【解决方案2】:

从 PHP 发送 headers 非常有用,例如,您可以发送 headers 来强制浏览器下载文件而不是在屏幕上显示文件(对于文件脚本,输出 CSV 的报告),控制缓存 headers 和执行页面重定向.

正如其中一个 cmets 所述,PHP 在许多安装中都是 Apache 的一个模块,它直接通过它发送标头。否则,标头将通过 CGI/FastCGI 或 nginx 的 PHP-FPM 发送。

您所考虑的或多或少是模板引擎,PHP 在该引擎上表现不错,但 PHP 具有通常在模板引擎中看不到的其他功能,例如打开套接字、处理文件等开。

我使用过的任何后端语言都支持发送 HTTP 标头,如果没有这种能力,我会认为任何面向 Web 的后端语言都是不完整的。

【讨论】:

  • 我明白这一点。我的问题是 apache 是如何知道该模块已解释的某个 PHP 文件包含一个用于发送标头的指令?
  • @yoyo_fun apache 正在从 PHP 获取输出,因此必须有一种机制。什么是发送标头的机制不一样? (提示:当输出已经发送时,您不能发送标头是有原因的)
【解决方案3】:

header('位置:http://www.google.com/');

这样我们就可以在php中设置header了

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 2016-03-22
    • 1970-01-01
    • 2015-07-29
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多