Response::json() 返回 text/html 作为内容类型

Posted

技术标签:

【中文标题】Response::json() 返回 text/html 作为内容类型【英文标题】:Response::json() returns text/html as content type 【发布时间】:2014-09-17 01:08:29 【问题描述】:

我目前面临一个奇怪的问题,我无法缩小问题范围。

在我的 Laravel 应用程序中,我通过 AJAX 检索数据。因此,应用程序的某些部分以 application/json 内容类型响应。

return Response::json(['message' => 'Some message']);

在我的本地网络服务器上一切正常。我收到Content-Type:application/json 作为回复。

我在服务器上部署了应用程序(也是 apache)并对其进行了测试。但问题就在这里。我不再得到正确的内容类型。相反,我得到text/html

所以有很多可能的问题来源,我对服务器配置并不太感兴趣。但这里是我已经尝试过的事情:

确保服务器具有 json 扩展并已启用 检查 laravel 源代码,了解为什么它不会返回正确的内容/类型(我找不到任何东西) 在本地和服务器上检查响应内容(没有区别) 我注意到 Response-Header 包含本地 Set-Cookie 其中包含:laravel_session=[...] 而服务器上的响应没有。

请不要发布建议检查内容类型并在必要时在客户端解析它的答案,因为尽管这是可能的,但服务器不应该那样做,我正在尝试找出原因

【问题讨论】:

你解决了吗?我有完全相同的问题。奇怪的是我的服务器中有其他 laravel 应用程序,它们运行得很好。 不幸的是我没有。我最终将其解析为 json 客户端 【参考方案1】:

这听起来更像是服务器配置问题,尤其是因为它在您的本地环境中运行良好,而不是在您的生产环境中。我知道您确保服务器具有 json 扩展名并且已启用,但您可能仍需要在生产服务器上仔细检查以下内容:

您的 Apache 配置中是否有 AddType application/json .json 指令(/etc/apache2/mods-available/mime.conf)? 您是否启用了 mod mime(可以通过 a2enmod mime 完成)?

【讨论】:

感谢您的回复。不幸的是,我无法检查,因为生产服务器是托管托管服务器。但我所做的是设置一个小脚本,在其中设置正确的 json 标头并返回一些 json 数据。它工作得很好,我也得到了application/json @thpl,你能分享一下脚本和细节吗?【参考方案2】:

也许这个答案来晚了,但昨天我遇到了这个问题,实际上已经解决了。我真的不知道为什么会发生这种情况,但我注意到每当我运行artisan serve 或任何其他工匠命令时,所有命令消息之前都会出现一个奇怪的选项卡。所以打开我所有的控制器,发现php 打开标签之前有一个标签。所以我有这样的事情:

    <?
class MyController extends BaseController
....

那个标签是偶然出现的,但似乎是它导致了问题。一旦我删除它,我所有的Response::json 调用返回的Content-Type 都返回为application/json

希望这会有所帮助,即使为时已晚。

【讨论】:

以上是关于Response::json() 返回 text/html 作为内容类型的主要内容,如果未能解决你的问题,请参考以下文章

Response::json() 发送 html 而不是 json

text 搜索Response.json

JavaScript fetch API - 为啥 response.json() 返回一个 promise 对象(而不是 JSON)? [复制]

fetch的使用--当无法判断后台返回数据为什么类型时如何操作

Python 爬虫 返回json内容

使用 fetch 的请求返回“typeerror: response.json is not a function”(ReactJS/node;express0 [关闭]