【问题标题】:Silex gives empty response if HTTP Status code != 200如果 HTTP 状态码 != 200,Silex 会给出空响应
【发布时间】:2015-11-16 00:52:05
【问题描述】:

我正在尝试设置一个小型 Silex RESTFul 服务器,现在我正在使用 HTTP 标头。

一个 GET 函数检查 If-Modified-Since 标头,并与数据库的 Last-Modified 项进行比较。

这是一个小代码示例:

if($hasModifications){
  $response = [items]
  $statusCode = 200;
} else {
  $response = ['result'=>'no modifications'];
  $statusCode = 304;
}
return $app->json($response,$statusCode,$headers);

每当 $statuscode!=200 时,我只会得到一个空白页,也不会发送自定义标题。这也破坏了 CORS,因为我无法设置 Access-Control-Allow-Origin 标头。

我应该用其他方式吗?

(PS:这不是实际代码,如果我将 $statusCode 替换为 200,那么一切都会恢复正常)

更新: 到目前为止,我猜从我一直在阅读的内容来看,304 状态不应该在响应的正文上发送任何内容。但是标题呢?如果我不遵守 CORS,那么 AngularJS 前端将失败,我将无法捕获“未修改”异常!。 显然,我可以通过其他方式解决。但如果我能让这两个东西都正常工作(REST+CORS)那就太好了!

更新 2:

var_dump($headers)
array(4) {
  ["Last-Modified"]=> string(29) "Fri, 21 Aug 2015 22:47:53 GMT"
  ["X-Status-Code"]=> int(304) 
  ["Cache-Control"]=> string(25) "post-check=0, pre-check=0" 
  ["Pragma"]=> string(8) "no-cache"
}

请注意,我使用 X-Status-Code 来告知真实的 HTTP 状态。 现在,响应代码如下:

return $app->json($response,200,$headers);

如果我将 200 更改为 304,我看不到 var_dump 的输出(给我一个空白页面)。此外,如果我设置没有标头参数的 304 状态,它仍然是相同的。 似乎 return$app->json 会清除 HeaderBag,因为我使用的是 JDesrosiers\Silex\Provider\CorsServiceProvider(),并且这些标头参数也会被清除。

这是从 Firefox 获取的原始 HTTP 响应,状态码为 304

Cache-Control: post-check=0, pre-check=0, private
Connection: Keep-Alive
Date: Sat, 22 Aug 2015 19:52:18 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.7 (Ubuntu)

还有这个,状态码200

Cache-Control: post-check=0, pre-check=0, private
Connection: Keep-Alive
Content-Length: 25
Content-Type: application/json
Date: Sat, 22 Aug 2015 19:53:12 GMT
Keep-Alive: timeout=5, max=100
Last-Modified: Fri, 21 Aug 2015 22:47:53 GMT
Pragma: no-cache
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.11
X-Status-Code: 304

【问题讨论】:

  • 你能把var_dump($headers)的输出贴出来吗?
  • 在编辑中添加了 var_dump($headers)、其他一些测试和两种情况下(200 和 304)的 HTTP 原始响应。

标签: rest http http-headers cors silex


【解决方案1】:

Apache 去除了 304 状态码上的 CORS 标头。

您可以在 issue #51223 中阅读更多内容,您还可以找到可以解决此问题的补丁。

如果您不想要或无法重新编译 Apache,您可以尝试运行 Nginx,这将保留 CORS 标头。

【讨论】:

  • 哦,太不幸了。我可以在本地设置上切换,但这将在共享主机上运行,​​所以我没有机会这样做。即使我通过 .htaccess 设置这些参数,它们也会被删除?到目前为止,解决方案是将状态设置为 200 并发送具有正确值的 X-Status-Code 标头。谢谢,亚历山德鲁。
  • 根据RFC 2616If the conditional GET used a strong cache validator the response SHOULD NOT include other entity-headers.。而且由于 CORS 标头无法识别,因此它们被视为实体标头。 (见Section 6 from RFC 2616)。所以从我的角度来看,Apache 遵循规范。但是,您可以在 enable-cors.org 网站上了解有关如何为 CORS 设置 Apache 的更多信息。
猜你喜欢
  • 2020-11-29
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 2016-04-10
  • 1970-01-01
相关资源
最近更新 更多