Symfony 错误页面不符合以下内容类型/格式

Symfony 错误页面不符合以下内容类型/格式,symfony,twig,Symfony,Twig,我遵循本教程,在app/Resources/TwigBundle/views/Exception中有error.html.twig和error.json.twig/ 即使请求的内容类型设置为application/json,所有错误都默认为错误页面的html版本 还定义了路线的格式: 请求标头: Accept: application/json Content-Type: application/json Connection: keep-alive Origin: chrome-extens

我遵循本教程,在app/Resources/TwigBundle/views/Exception中有error.html.twig和error.json.twig/

即使请求的内容类型设置为application/json,所有错误都默认为错误页面的html版本

还定义了路线的格式:

请求标头:

Accept: application/json
Content-Type: application/json
Connection: keep-alive
Origin: chrome-extension: //rest-console-id
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko)           Chrome/18.0.1025.162 Safari/535.19
响应标题:

Status Code: 404
date: Sun, 29 Apr 2012 06:54:35 GMT
Content-Encoding: gzip
X-Powered-By: PHP/5.3.10
Transfer-Encoding: chunked
Connection: keep-alive
Server: nginx
Content-Type: text/html; charset=UTF-8
cache-control: no-cache

我没有主意了。。。我真的需要一个json版本的错误,我的API才能工作…

我刚刚遇到了同样的问题,尽管你的问题很老了,symfony从那时起增加了几个版本,但这个问题仍然是相关的,所以即使你不再需要知道它,也许其他人会知道

您最初的问题很可能是由所描述的错误引起的,但在最初的帖子之后,并没有发生太多的事情。从那时起,整个代码库都被更新了,因此,虽然相同的症状再次出现,但错误与此无关。我把它贴在这里是因为这些天来任何想寻找答案的人都可能会像我一样找到这个问题:

即使直接从内核异常处理程序返回JsonResponse,它仍然具有内容类型:text/html;字符集=UTF-8。这让我非常困惑,以至于我使用netcat发出了一个手动请求,中间没有任何智能软件,结果证明,这种情况下的响应实际上有两个不同的内容类型头:

HTTP/1.0 500 Internal Server Error
Connection: close
X-Powered-By: PHP/5.5.9-1ubuntu4.17
Content-Type: text/html; charset=UTF-8
Cache-Control: private, must-revalidate
Content-Type: application/json
pragma: no-cache
expires: -1
X-Debug-Token: 775c55
X-Debug-Token-Link: http://127.0.0.1:8000/_profiler/775c55
Date: Thu, 27 Oct 2016 23:08:31 GMT
现在,双内容类型的标题不是你每天都能看到的东西。这似乎是在Symfony\Component\Debug\ExceptionHandler类中实现的,该类仅在调试模式下使用。为了尽可能健壮,它首先呈现描述抛出异常的标准Symfony错误页面。呈现的内容不会直接发回,而是利用PHP的输出缓冲功能来缓冲和存储生成的输出。然后,它尝试从框架生成自定义错误页。如果失败,则发送先前准备好的消息

然而,输出缓冲仅适用于消息内容,而不适用于消息头-这些消息头总是直接发送的。这个问题只出现在调试环境中,错误时出现的异常内容类型仅在WebAPI中常见,在WebAPI中,调试模式几乎没有什么用处。这使得暴露面相对较小,但如果同时提供WebAPI和最终用户界面的应用程序需要测试,这可能会成为一个问题

在不修改内部Symfony文件的情况下解决此问题似乎是不可能的。输出控制位于symfony内核的深处,不提供任何配置。无论如何,我不相信这种解决办法的好处。若有人能向我解释一下,在自定义异常处理过程中会发生什么,在默认处理程序失败的情况下会使它变得无用?
可能是用户代码弄乱了ob_*函数?

我也遇到了同样的问题,尽管你的问题已经很老了,symfony从那以后又推出了几个版本,但这个问题仍然存在,所以即使你不需要再了解它,也许其他人也会知道

您最初的问题很可能是由所描述的错误引起的,但在最初的帖子之后,并没有发生太多的事情。从那时起,整个代码库都被更新了,因此,虽然相同的症状再次出现,但错误与此无关。我把它贴在这里是因为这些天来任何想寻找答案的人都可能会像我一样找到这个问题:

即使直接从内核异常处理程序返回JsonResponse,它仍然具有内容类型:text/html;字符集=UTF-8。这让我非常困惑,以至于我使用netcat发出了一个手动请求,中间没有任何智能软件,结果证明,这种情况下的响应实际上有两个不同的内容类型头:

HTTP/1.0 500 Internal Server Error
Connection: close
X-Powered-By: PHP/5.5.9-1ubuntu4.17
Content-Type: text/html; charset=UTF-8
Cache-Control: private, must-revalidate
Content-Type: application/json
pragma: no-cache
expires: -1
X-Debug-Token: 775c55
X-Debug-Token-Link: http://127.0.0.1:8000/_profiler/775c55
Date: Thu, 27 Oct 2016 23:08:31 GMT
现在,双内容类型的标题不是你每天都能看到的东西。这似乎是在Symfony\Component\Debug\ExceptionHandler类中实现的,该类仅在调试模式下使用。为了尽可能健壮,它首先呈现描述抛出异常的标准Symfony错误页面。呈现的内容不会直接发回,而是利用PHP的输出缓冲功能来缓冲和存储生成的输出。然后,它尝试从框架生成自定义错误页。如果失败,则发送先前准备好的消息

然而,输出缓冲仅适用于消息内容,而不适用于消息头-这些消息头总是直接发送的。这个问题只出现在调试环境中,错误时出现的异常内容类型仅在WebAPI中常见,在WebAPI中,调试模式几乎没有什么用处。这使得暴露面相对较小,但如果同时提供WebAPI和最终用户界面的应用程序需要测试,这可能会成为一个问题

在不修改内部Symfony文件的情况下解决此问题似乎是不可能的。输出控制位于symfony内核的深处,不提供任何配置。无论如何,我不相信这种解决办法的好处。 若有人能向我解释一下,在自定义异常处理过程中会发生什么,在默认处理程序失败的情况下会使它变得无用?
可能是用户代码弄乱了ob_*函数?

看来我们需要更多的信息才能找到问题的根源。如果您的模板具有正确的命名,Symfony应该会在正确的文件中自动找到它。您应该检查以确保error.json.twig模板没有任何错误,并且它的名称确实正确,尾随空格或前导空格在某些文件系统上有效,并且可能很难看到。为了使调试更容易,您可能需要扩展默认的ExceptionController,并直接查看Request::getRequestFormat的输出,以查看您的请求是否显示为JSON。看起来我们需要更多的信息才能找到问题的根源。如果您的模板具有正确的命名,Symfony应该会在正确的文件中自动找到它。您应该检查以确保error.json.twig模板没有任何错误,并且它的名称确实正确,尾随空格或前导空格在某些文件系统上有效,并且可能很难看到。为了使调试更容易,您可能需要扩展默认的ExceptionController,并直接查看Request::getRequestFormat的输出,以查看您的请求是否显示为JSON。