最近我将项目从使用Apache的标准PHP切换到使用NGINX的PHP-FPM。我立即注意到所有JSON请求都返回了text / html内容类型,之前它们返回了application / json。
经过几个小时搜索谷歌和堆栈溢出并找不到任何东西,老实说开始认为我疯了,我终于意识到,纯粹是偶然的,问题源于设置两次Content-Type标题。一旦在应用程序的入口点开始,默认为text / html,然后再次通过设置application / json时特别想要发送JSON(在XHR请求的情况下)。
我的问题是,为什么不同?为什么在Apache和PHP下完美运行的代码停止在NGINX和PHP-FPM下运行?使第二次调用header()失败的组合是什么?
作为后续工作,代码是否曾在Apache / PHP下工作,或者设置内容类型两次本身就不好/不赞成?
答案 0 :(得分:0)
设置两次Content-Type标头是非法的,因此行为将是未定义的。
参见RFC7230第3.2.2节:
发件人不得在邮件中生成具有相同字段名称的多个标头字段,除非该标头字段的整个字段值定义为逗号分隔列表[即#(值)]或标题字段为一个众所周知的例外(如下所述)。
Web服务器通常会清理应用程序发出的HTTP标头,例如添加缺少的标头。一个假设Apache删除了重复的标题,而nginx
没有。