【问题标题】:php-fpm, nginx, and headersphp-fpm、nginx 和标头
【发布时间】:2017-11-19 21:00:39
【问题描述】:

最近我将一个项目从使用 Apache 的标准 PHP 切换到使用 NGINX 的 PHP-FPM。我立即注意到所有 JSON 请求都返回了之前返回 application/json 的 text/html 内容类型。

经过数小时搜索谷歌和堆栈溢出但一无所获,老实说开始认为我疯了,我终于意识到,纯属偶然,问题源于两次设置 Content-Type 标头。在应用程序入口点的最开始,默认为 text/html,然后再次通过设置 application/json 来发送 JSON(在 XHR 请求的情况下)。

我的问题是,为什么会有差异?为什么在 Apache 和 PHP 下运行良好的代码在 NGINX 和 PHP-FPM 下停止运行?导致第二次调用 header() 失败的组合是什么?

作为后续,代码是否应该在 Apache/PHP 下工作过,或者是否两次设置 Content-Type 本身就不好/不赞成?

【问题讨论】:

    标签: php nginx http-headers content-type


    【解决方案1】:

    两次设置 Content-Type 标头是非法的,因此行为将是未定义的。

    参见 RFC7230 第 3.2.2 节:

    发送者不得在消息中生成多个具有相同字段名称的头字段,除非该头字段的整个字段值定义为逗号分隔列表 [即,#(values)] 或头字段是一个众所周知的例外(如下所述)。

    Web 服务器通常会清理应用程序发出的 HTTP 标头,例如添加缺失的标头。假设 Apache 删除了重复的标头,而 nginx 没有。

    【讨论】:

    • 那为什么 PHP 有 $replace 参数呢?不应该假设如果默认行为是替换标头,PHP 将处理此问题,甚至不应该将副本发送到 Apache/NGINX?
    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2018-05-03
    相关资源
    最近更新 更多